home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 11
/
Cream of the Crop 11-2.iso
/
extra_2
/
xyz101s.zip
/
XYZ101.DOC
< prev
Wrap
Text File
|
1995-10-28
|
158KB
|
3,495 lines
╔═════════════════════════════════════════════════════════════════════╗
║ System requirements ║
╚═════════════════════════════════════════════════════════════════════╝
To run XYZ you will need to meet the following requirements:
1. An 80286 or above IBM compatible computer
2. DOS version 3.3 or above
3. A minimum 128k of free dos memory
╔═════════════════════════════════════════════════════════════════════╗
║ Advantages of XYZ ║
╚═════════════════════════════════════════════════════════════════════╝
1. XYZ is very easy to read and write...no programming degree needed!
2. XYZ compiles to a very small code size.
3. XYZ is inexpensive.
4. XYZ makes fast programs.
5. The XYZ math functions have a variable number of digits...from 9
to 53 digits in length!
╔═════════════════════════════════════════════════════════════════════╗
║ Disadvantages of XYZ ║
╚═════════════════════════════════════════════════════════════════════╝
1. XYZ is limited to 111 characters per line in the source file.
2. This version of XYZ is limited to COM files of less than 64k bytes
in size.
3. The shareware version of XYZ is limited to 30 lines of code.
╔═════════════════════════════════════════════════════════════════════╗
║ Theory behind XYZ ║
╚═════════════════════════════════════════════════════════════════════╝
The purpose behind the creation of XYZ was to enable anyone to sit
down and write their own software or create their own utilities
without having to have a degree in programming to do it. I have seen
the cryptic code that even languages as simple as BASIC and FORTRAN
have and I thought..."there must be a better way.".
There is a revolution of technology taking place in the computer
industry today but unfortunately, there isn't a corresponding
revolution taking place in human nature as far as quality is
concerned. I don't know about you but I'm tired of being forced to
decide between the lesser of two evils when it comes to buying
software. I want to help change that. That is why I decided to make
this software compiler available. Now you or I can decide how much
quality goes into our software and what features we want with it and
all we have to do is just spend a little time to write it ourselves.
Please just take a few moments to look at this software and see if
this is what you've been looking for too. If you don't like it,
that's OK, but please, send me a line and let me know what you think
could be done to make it better.
To accomplish my goal of a simple compiler, I designed XYZ with these
goals in mind:
1. Simple to read and simple to write.
2. XYZ uses mostly three letter commands. This is because research
has shown that three letter words are the easiest words for
people to remember. By placing all commands as the first word
of each line, it is also easier to scan for certain words or
catch mistakes in typing.
3. XYZ cannot use weird, hard to remember syntax, symbols or
reserved arguments.
But no matter how simple programming is made, programming will always
require a person to have strong logical thinking abilities. XYZ
cannot teach you how to think better logically, but if you are
already a good logical thinker, it can help you put your logical
thoughts into computer code easier. XYZ wasn't made with the thought
of making programming simpler at the cost of losing power over your
computer environment either. It has to be simple enough for the
casual user as well as powerful enough for the experienced
programmer to use.
╔═════════════════════════════════════════════════════════════════════╗
║ XYZ License Agreement ║
╚═════════════════════════════════════════════════════════════════════╝
XYZ is copyright material owned by Andrew Robinson and is protected
by United States copyright laws and international treaty provisions.
THIS IS A LEGAL AGREEMENT BETWEEN ALL USERS OF ALL VERSIONS OF XYZ:
XYZ is provided as a shareware program. This entitles one person on
one computer to use and evaluate this product for a period of 30
days. Only the shareware version of XYZ is freely distributable.
Should you decide not to register this product, then all source code
and/or executable software/firmware derived from this XYZ software
application product will remain as the legal property of the owner of
the XYZ software application product.
If you decide to become a registered user, then the owner of the XYZ
software application product will grant you a non-exclusive
royalty-free right to publish your source code and executable
software PROVIDED that you:
1. Do not use the XYZ name, logo, or trademark to market your
software application product.
2. Agree to indemnify, hold harmless, and defend the owner of the
XYZ software application product from and against any claims
or lawsuits (including attorney's fees) that arise or result
from the use of distribution of your software application
product.
3. Do not publish any part or whole of the XYZ software application
product as firmware.
4. Agree to publish your name and/or registration number with the
source code to your software application product (if the source
code is published). It is your responsibility to ensure that
your name and/or registration number remain intact with your
software application product during distribution.
5. Agree to use only the registered version of XYZ to derive your
software application product.
Registering the XYZ software application product will entitle one
person on one computer to use this product per registration. You may
not rent or lease the registered XYZ software application product to
anyone. You may not transfer ownership of the registration. You may
make one copy of the registered XYZ software application product
solely for the purpose of backup or archiving.
You may not reverse engineer, decompile, disassemble, or make
derivatives of any version of the XYZ software application product.
╔═════════════════════════════════════════════════════════════════════╗
║ XYZ Limited Warranty ║
╚═════════════════════════════════════════════════════════════════════╝
The unregistered version of the XYZ software application product is
provided "as is", without warranty of any kind.
All warranties (including any implied warranties) for the registered
version of the XYZ software application product are for a period of
ninety (90) days from the date of receipt of registration. XYZ is
warranted to perform substantially in accordance with the accompanied
written or archived material distributed with the XYZ software
application product.
To the maximum extent permitted by the law, the owner of XYZ
disclaims all other expressed or implied warranties including
warranties implying merchanability and fitness for a particular
purpose.
To the maximum extent permitted by the law, in no event shall the
owner of XYZ be liable for any damages whatsoever (including without
limitation, damages for loss of business profits, interruption of
business, loss of business information, or any other pecuniary loss)
arising out of the use of or inability to use this product, even if
the owner of XYZ has been advised of the possibility of such damages.
Some limitations discussed here may not apply to you depending on
your local state or jurisdiction rulings on these matters.
╔═════════════════════════════════════════════════════════════════════╗
║ TABLE OF CONTENTS: ║
╚═════════════════════════════════════════════════════════════════════╝
CHAPTER TITLE: LINE#:
System requirements ...........................................0001
Advantages of XYZ 0008
Disadvantages of XYZ ..........................................0017
Theory behind XYZ 0024
XYZ License Agreement .........................................0069
XYZ Limited Warranty 0116
TABLE OF CONTENTS: ............................................0143
How to compile source files 0329
Definition of ARGUMENT TYPES: .................................0342
NUMERIC argument types 0361
TEXT argument types .........................................0399
RESERVED argument types 0410
Description of program commands: ..............................0493
/// (and adding comments) 0504
--- .........................................................0564
abs 0583
acos ........................................................0615
acosh 0615
add .........................................................0588
and 0592
asin ........................................................0615
asinh 0615
atan ........................................................0615
atanh 0615
call ........................................................0638
cmp 0670
convert .....................................................0730
cos 0750
cosh ........................................................0750
dat 0765
dec .........................................................0868
div 0872
draw ellipse ................................................0877
draw line 0877
draw rotated ellipse ........................................0877
end 0937
eof .........................................................0946
exp 0953
ext .........................................................0958
file 0990
find ........................................................1094
goto 1117
inc .........................................................1122
input 1126
int .........................................................1148
ior 1175
jeq .........................................................1197
jer 1207
jge .........................................................1217
jgt 1227
jle .........................................................1237
jlt 1247
jne .........................................................1257
len 1267
log .........................................................1274
mouse 1279
mul .........................................................1356
neg 1361
plot ........................................................1365
pop 1447
prn .........................................................1385
push 1447
read ........................................................1438
ret 1463
save ........................................................1468
scr 1494
set .........................................................1510
sin 0772
sinh ........................................................0772
slm 1687
snd .........................................................1700
sub 1719
tan .........................................................0780
tanh 0780
tty .........................................................1727
wait 1736
xor .........................................................1744
XYZ COMPILE TIME ERROR MESSAGES: 1770
Reporting bugs or giving advice ...............................1801
Controlling the flow of code 1831
Sample programs to compile ....................................1917
Becoming a registered user 2154
APPENDIX: .....................................................2183
Table of key codes: 2186
Table of video modes and their default colors: ..............2229
Table of ASCII codes: 2285
List of some common DOS 21h interrupts: .....................2332
Auxiliary Input 2335
Auxiliary Output ..........................................2339
Character Input with Buffer 2343
Character Input without buffer ............................2347
Character Input with Echo 2358
Character Input without Echo (unfiltered) .................2362
Character Input without Echo 2366
Character Output ..........................................2370
Character string, Output 2374
Check Input Status ........................................2378
Create New Program Segment Prefix (PSP) 2383
Direct Console I/O ........................................2387
Disk, Get allocation information about 2397
Disk, Get current .........................................2407
Disk, Get data on 2411
Disk, Read sector from (ignoring logical structure) .......2419
Disk, Reset 2433
Disk, Select ..............................................2436
Disk, Write Sector to (ignoring logical structure) 2441
Duplicate Handle ..........................................2455
Execute Program 2465
File directory, Create ....................................2475
File directory, Delete 2483
File directory, Find First File in ........................2491
File directory, Find Next File in 2514
File directory, Get current ...............................2531
File directory, Set current 2542
File, Close ...............................................2550
File, Commit (forces buffer to be written out) 2558
File, Create ..............................................2566
File, Create Temporary 2582
File, Create new ..........................................2598
File, Delete 2614
File, Extended open, create, or replace ...................2622
File, Get or Set Attributes of 2669
File, Get or Set Date and Time of .........................2685
File, Lock or unlock region of 2707
File, Open ................................................2722
File, Rename 2745
File, Set Handle Count (sets maximum number of files) .....2754
File, Set location of pointer in 2762
File or Device, Read from .................................2777
File or Device, Write to 2789
Get Data Transfer Area (DTA) Address ......................2801
Get Date 2805
Get Extended Country Information ..........................2812
Get Extended Error Information 2827
Get Interrupt Vector ......................................2870
Get DOS Version Number 2875
Get Program Segment Prefix (PSP) Address ..................2880
Get Return Code 2884
Get Time ..................................................2895
Get Verify Flag 2902
Get address of InDOS Flag .................................2907
Get or Set Allocation Strategy 2911
Get or Set Break Flag .....................................2928
Get or Set Code Page 2935
Get or Set Country Information ............................2949
IOCTL (Input/Output Control): 3001
Get Device Information ..................................3002
Change Sharing Retry Count 3031
Check Input Status ......................................3040
Check Output Status 3055
Check if Block Device is Remote .........................3067
Check if Block Device is Removable 3078
Check if Handle is Remote ...............................3087
Generic I/O Control for Block Devices 3099
Generic I/O Control for Character Devices ...............3121
Get Logical Drive Map 3147
Read Control Data from Block Device Driver ..............3160
Read Control Data from Character Device Driver 3171
Set Device Information ..................................3182
Set Logical Drive Map 3200
Write Control Data to Block Device Driver ...............3213
Write Control Data to Character Device Driver 3224
Memory, Allocate Block ....................................3236
Memory, Release Block 3247
Memory, Resize Block ......................................3255
Multiplex Interrupt 3264
Printer Output ............................................3273
Redirect Handle 3278
Set Data Transfer Area (DTA) Address ......................3284
Set Date 3288
Set Extended Error Information ............................3296
Set Interrupt Vector 3301
Set Program Segment Prefix (PSP) Address ..................3306
Set Time 3310
Set Verify Flag ...........................................3319
Terminate Program 3322
Terminate Program with Return Code ........................3326
Terminate and stay resident (TSR) 3330
List of DOS Extended Error Codes ..............................3334
Using the XYZ Critical Error Handler 3414
╔═════════════════════════════════════════════════════════════════════╗
║ How to compile source files ║
╚═════════════════════════════════════════════════════════════════════╝
To compile your source file, you will need to type:
XYZ infile.??? outfile.com
For example (assume your source file is called "example.src"):
XYZ example.src list.com
Would compile "example.src" and create an executable file from it
called "example.com".
╔═════════════════════════════════════════════════════════════════════╗
║ Definition of ARGUMENT TYPES: ║
╚═════════════════════════════════════════════════════════════════════╝
First, let's discuss what exactly is an argument. Most XYZ commands
consist of a three letter word followed by a space. The arguments
are the variables that follow each command. For example, if the
command is an add instruction, then add will be followed by two
arguments that will be added together. But every command cannot
deal with the same arguments as every other command can. The data
stored in a numeric argument is not the same as the data stored in a
text argument. The computer can't tell them apart unless you tell it
by defining your arguments. That is why we must define argument
types when programming on computers. All XYZ argument names can use
any letter or symbol in their name except for a space (The space
indicates the end of a name). The maximum length of the name is
thirty characters. Once defined as either a numeric or text
variable, that same name cannot be used again. XYZ has three basic
argument types defined for it: NUMERIC, TEXT, and RESERVED argument
types.
┌─────────────────────────────────────────────────────────────────────┐
│ NUMERIC argument types... │
└─────────────────────────────────────────────────────────────────────┘
Numeric argument types have their number of significant digits
predefined at the first line of every XYZ text file with a three
digit number. This number may range from 009 digits to 053 digits.
Each numeric argument thereafter will take up the same amount of
significant digits. If the number 014 is typed as the first line,
then the command "sin number" would display the sin of "number" up
to 14 digits in length. If that isn't enough digits then you
could change the first line to read 033 and the "sin number" would
display the sine of "number" to 33 digits.
Some examples of a numeric argument name would be:
NUMBER1
number2
MAGNETOHYDRODYNAMICS
GIV-ME.2(OF_THEM)!
ETC...
Paid$
Every numeric argument name must be entered in the same format.
The format is (in this order only):
1. Give the sign of the number..."-" for negative numbers or nothing
for positive numbers.
2. Type the number (and the decimal place wherever it is needed).
3. Type a small e if you want to enter an exponent in the number.
4. Give the sign of the exponent..."-" for negative numbers or
nothing for positive numbers. The exponent cannot be greater
than 32767 or smaller than -32767.
Some examples of how you could type a number to be entered into a
numeric variable would be:
dat num Paid$=-1.2345e-245
dat num Paid$=135.7e24
dat num Paid$=5
┌─────────────────────────────────────────────────────────────────────┐
│ TEXT argument types... │
└─────────────────────────────────────────────────────────────────────┘
stores text strings and must be predefined by the command "dat txt".
Some examples of a text argument name would be:
NUMBER1
WHAT!?...
number2
1forthe$money$
2fortheshow
┌─────────────────────────────────────────────────────────────────────┐
│ RESERVED argument types... │
└─────────────────────────────────────────────────────────────────────┘
are already predefined by XYZ. Using these argument types for
anything else other then their intended use can result in errors. The
following is a listing of all reserved variables used by XYZ:
The numeric argument: result
The text argument: buffer
The symbols = and *
These special numeric arguments:
angle
blank
char
col
col2
color
color2
dash1
dash2
error
freq
handle
hite
lptn
mode
mouse
row
row2
size
start
start2
usr1
usr2
usr3
wide
xmin
xmax
ymin
ymax
These special words:
videomode
tty
All of the special numeric arguments have been predefined as numeric
arguments for different XYZ commands. The range of these numeric
arguments is from 0 to 65535 except for the word color and color2
which has a range of 0 to 16,777,215. When used as text arguments,
all special arguments will accept only one letter of text.
The two special words listed above (videomode and tty) are commands
to be used with the "set" command.
The numeric variable "result" has a special place in XYZ. It is the
place where all of the math commands store the result of their
calculations. "Result" must always be the first numeric argument
following the command (except for "sub").
For example:
add Male and Female
adds the number of Males to the number of Females and places the
result of this calculation in the reserved numeric argument "result"
for later retrieval by another command like the following example:
add Male and Female
div result by Children
which adds the number of Males to the number of Females and then
divides the resulting number by the number of Children. Notice that
the sub command is the only command in which the first numeric
argument appears second so that proper use of the sub command when
using the reserved variable "result" would be:
sub Children from result
The text argument "buffer" is another case of a special variable in
the XYZ language. It is a predefined text argument that is 300
characters in length. When your XYZ program is first run, this
argument is filled up with the contents of the command line for the
firsts 128 characters and gibberish for the rest of the text
argument.
╔═════════════════════════════════════════════════════════════════════╗
║ Description of program commands: ║
╚═════════════════════════════════════════════════════════════════════╝
Remember...all of the XYZ commands are case sensitive so that if any
commands are typed into a XYZ program other than the way they have
been described below, they won't be recognized as legal commands.
Also each command is three letters followed by one space. The
following pages are a listing of each command used by XYZ along with
the type and number of arguments needed for each command. A short
description is given of the use of each command and finally, each
description is followed by an example of that command if needed.
┌─────────────────────────────────────────────────────────────────────┐
│ /// and adding comments │
└─────────────────────────────────────────────────────────────────────┘
Since XYZ is such a simple language to write, there is plenty of room
leftover for typing comments. Comments can be added right after the
last argument of a command (after the space). Comments can make a big
difference on how readable your code is to someone else because it
can be used to explain the logic you used or to document some
function without the reader having to look it up. It can also be
used to show the routing of jump commands. For example, taking the
small routine from the mouse command example...
set mouse=0
mouse button
jeq LeftButtonPressed
jne LeftButtonNotPressed
--- LeftButtonPressed
mouse cursor=Newcursor
--- LeftButtonNotPressed
end with 0
I can add comments to explain what I'm trying to do...
set mouse=0 will check the status of the left...
mouse button ...when it was last pressed.
jeq LeftButtonPressed
jne LeftButtonNotPressed
--- LeftButtonPressed
mouse cursor=Newcursor will change the cursor.
--- LeftButtonNotPressed
end with 0
Better yet, I can show the results of each jump, making the program
even more readable...
set mouse=0 will check the status of the left...
mouse button ...when it was last pressed.
jeq LeftButtonPressed ──────────────────────────┐
jne LeftButtonNotPressed ─────────────────────┐ │
--- LeftButtonPressed ────────────────────────│─┘
mouse cursor NewCursor will change the cursor. │
--- LeftButtonNotPressed ─────────────────────┘
end with 0
Finally, the characters "/// " are reserved as a comment line. This
can enable me to separate the program into sections like this...
set mouse=0 will check the status of the left...
mouse button ...when it was last pressed.
jeq LeftButtonPressed ──────────────────────────┐
jne LeftButtonNotPressed ─────────────────────┐ │
/// If the left mouse button was pressed: │ │
--- LeftButtonPressed ────────────────────────│─┘
mouse cursor=NewCursor will change the cursor. │
/// Either way we'll end up here anyways... │
--- LeftButtonNotPressed ─────────────────────┘
end with 0
Use your own imagination to come up with even more ways to make your
program even more readable then this one.
┌─────────────────────────────────────────────────────────────────────┐
│ --- LABEL │
└─────────────────────────────────────────────────────────────────────┘
The --- command is where one part of a XYZ program can reference
another part of the same program through the jump or goto commands.
For example:
cmp buffer to Error!
jeq Errors
goto Elsewhere
--- Errors
end 2
If the result of the "cmp buffer to Error!" is equal, then the
program will jump to the location labeled "Errors". From there it
will end the program with an error level of 2. If the result of the
compare is not equal, then the program will goto the location labeled
Elsewhere.
┌─────────────────────────────────────────────────────────────────────┐
│ abs NumericArgument │
└─────────────────────────────────────────────────────────────────────┘
Computes the absolute value of the numeric argument and places the
result in "result".
┌─────────────────────────────────────────────────────────────────────┐
│ add NumericArgument1 and NumericArgument2 │
└─────────────────────────────────────────────────────────────────────┘
Adds the arguments shown and places the result in "result".
┌─────────────────────────────────────────────────────────────────────┐
│ and TextArgument │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<Position of first char>
set size=<Number of chars to And>
set char="Character to And with"
Ands TextArgument with the specified character, starting at character
number "start". This routine will end after "size" number of
characters have been anded.
For example:
set start=1
set size=13
set char=F
and TextArgument
will And whatever text is in TextArgument with the letter F. It will
do this starting with the 1st character until it has anded 13
characters altogether.
┌─────────────────────────────────────────────────────────────────────┐
│ acos NumericArgument │
│ asin NumericArgument │
│ atan NumericArgument │
│ acosh NumericArgument │
│ asinh NumericArgument │
│ atanh NumericArgument │
└─────────────────────────────────────────────────────────────────────┘
Compute the arccosine, arcsine, arctangent, archypcosine, archypsine,
or archyptangent of the numeric argument and places the result in
"result" (in units of radians).
For example:
arc cos SomeNumber
arc hyp cos AnotherNumber
will compute the arccosine of SomeNumber and place the result of that
calculation in "result". Then the archypcosine of AnotherNumber will
be computed and placed in "result".
The range for the arc functions are: x²<=1
except for acosh in which x²>=1
┌─────────────────────────────────────────────────────────────────────┐
│ call LABEL │
│ call TextArgument │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<Position within TextArgument to find handle>
Calls the subroutine labeled --- LABEL. Starts executing the next
instruction following the --- LABEL instruction until a "ret"
instruction is encountered. Then XYZ starts executing the next
instruction following the original call instruction. Also will call
the subroutine whose address is stored in TextArgument starting at
"start".
For example:
set start=1
set handle=DoSomething
save handle to TextArgument
call DoSomething
call TextArgument
end with 0
--- DoSomething
ret
will call the subroutine DoSomething. DoSomething will then just
return to the statement following the call statement...call
TextArgument. Call TextArgument is the same as call DoSomething which
will just return to the statement following this call statement
"end", which will just end the program.
┌─────────────────────────────────────────────────────────────────────┐
│ cmp NumericArgument1 to NumericArgument2 │
└─────────────────────────────────────────────────────────────────────┘
Compares the first numeric argument to the second.
┌─────────────────────────────────────────────────────────────────────┐
│ cmp ReservedArgument1 to ReservedArgument2 │
└─────────────────────────────────────────────────────────────────────┘
Compares the first reserved argument to the second. The only
exception to this rule is the reserved argument color because of its
wider range of 0 to 16,777,215. All other reserved arguments have
the range of 0 to 65535.
For example:
cmp size to mouse
cmp col to blank
is legal while:
cmp color to angle
is not.
┌─────────────────────────────────────────────────────────────────────┐
│ cmp TextArgument1 to TextArgument2 │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<Position of first character to Cmp in first argument>
set size=<Number of characters to Cmp>
set start2=<Position of first character to Cmp in second argument
CoMPares "size" number of characters in the first TEXT argument
(starting at position "start") to the second TEXT argument (starting
at position "start2"). These reserved arguments must be Set before
using the cmp statement for the first time. Cmp counts each
character it CoMPares until it finds the first mismatch and then
stops and reports its findings of the mismatch as greater than,
lesser than, equal to (or some combination of these). The location
of this mismatch is returned to the reserved argument size.
For example:
set start=1
set size=3
set start2=2
cmp Textargument1 to TextArgument2
jne Somewhere
will take 3 characters of text in TextArgument1 (starting with the
1st character) and CoMPare it to whatever text is in TextArgument2
(starting with the 2nd character). If the string contained in
TextArgument1 is
HI!
and the string contained in TextArgument2 is
.HI?
then cmp will return a less than and not equal result to XYZ, set
size to 3, and jump to the location --- Somewhere.
┌─────────────────────────────────────────────────────────────────────┐
│ convert NumericArgument to TextArgument │
│ convert ReservedArgument to TextArgument │
│ convert TextArgument to result │
│ convert TextArgument to ReservedArgument │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<Position of first character to start at>
The command "convert TextArgument to result" will start the
conversion at "start" number of characters and will stop whenever it
reaches either a space or any invalid character (any character that
is not a number). It will ALWAYS place the result in "result".
For the command "convert NumericArgument to TextArgument" the
characters will be placed in the given TextArgument at the position
"start" and "size" will be set equal to the number of characters
converted (how many significant digits were placed in the
TextArgument).
┌─────────────────────────────────────────────────────────────────────┐
│ cos NumericArgument │
│ sin NumericArgument │
│ tan NumericArgument │
│ cosh NumericArgument │
│ sinh NumericArgument │
│ tanh NumericArgument │
└─────────────────────────────────────────────────────────────────────┘
Computes the cos, sin, tan, cosh, sinh, or tanh of the numeric
argument and places the result in "result". NumericArgument must be
given in radians for the trig functions.
The range for these trigs functions are: x²<∞ (infinity)
except for cosh in which x²<=1
and except for tan in which x cannot equal a multiple of π (pi).
┌─────────────────────────────────────────────────────────────────────┐
│ dat num NumericArgument= │
│ dat txt ## TextArgument= │
│ dat mouse TextArgument │
└─────────────────────────────────────────────────────────────────────┘
The dat command is placed at the beginning of every XYZ program after
the first line (which is reserved for the size of num arguments). The
dat command is where all arguments to be used in the program are
listed (except for reserved arguments). For example, if a text
argument is called that is not listed in a dat command, then an error
will result during compilation. Dat places data into the numeric or
text argument during compilation if the "=" sign is used as a
delimiter. This is useful for reducing file sizes by setting numeric
or text arguments before the program has to run rather then setting
them during run time. If two dat statements use the same text or
numeric argument name, then the second statement will have no effect.
SETTING TEXT ARGUMENTS...
The command, "dat txt ## TextArgument=" is used to define and
initialize text arguments. The ## parameter is used to reserve
memory for each text argument and can range from one to five thousand
or more characters in length. This is how much memory is reserved for
each text argument used. "Dat txt" statements that span more than one
line should be indented with four spaces because XYZ will terminate
the dat txt statement when it encounters ANY character on the next
line (including the TAB character). Each successive line starting
with four blanks will insert the "Enter" key into that text argument
starting at the beginning of that line.
For example:
dat txt 00 SomeText=What \in/ the "world" is
this?
dat txt 10 MoreText=Hi!
will insert the text string:
What \in/ the "world" is
this?
into the text argument SomeText, and the text string:
Hi!
into the text argument MoreText. Notice that the first dat statement
will reserve only enough bytes of memory to be able to store the text
string listed, while the second dat statement will reserve 10 bytes
of memory for the second text argument but initialize the first three
bytes to the word "Hi!".
SETTING NUMERIC ARGUMENTS...
The first line of EVERY XYZ program is a three digit number ranging
from 001 to 011. This number specifies how many words to reserve for
each numeric argument (a word is two bytes of memory or disk space).
This will also determine how many significant digits will be in all
numeric arguments. See the topic "NUMERIC argument types" for
examples on the proper syntax for initializing numeric arguments.
For example:
dat num Volume=1.23e-4
dat num Molecules
will reserve two numeric arguments. The first will be set to 1.23e-4
and the second will contain uninitialized data.
SETTING TEXT ARGUMENTS FOR CURSORS...
For defining mouse cursors there is a special dat command. It is "dat
mouse" and it creates a text argument 34 bytes in length. The syntax
is as follows:
dat mouse TextArgument xxxx yyyy ─LOCATION OF THE x,y HOTSPOT
dat ................ ─First char on this line is point 0,0
dat .......*........
dat ......*o*.......
dat ......*o*.......
dat ......*o*.......
dat ......*o*.......
dat ..***** *****...
dat .*oooo oooo*.. ─If you wanted the center of this crosshair
dat ..***** *****... to be the cursor hotspot, "xxxx yyyy" would
dat ......*o*....... be replaced with the numbers 7 7
dat ......*o*.......
dat ......*o*.......
dat ......*o*.......
dat .......*........
dat ................
dat ................
where xxxx and yyyy represents a number (-127 through 128) that
refers to a location (relative to the first character of the second
dat statement) that represents the location of the cursor...also
called the cursor hotspot. The actual mouse cursor is assembled
using four "colors" only. The colors are: black, white, transparent,
and inverted. The "*" characters represent black, the "o" characters
represent white, the "." characters represent transparent, and the
" " represents inverted. See the topic "Sample programs to compile"
for examples of how to create a new graphics cursor. The word
TextArgument should be replaced with the name of your cursor such as
"crosshair" or something appropriate like that.
┌─────────────────────────────────────────────────────────────────────┐
│ dec ReservedArgument │
└─────────────────────────────────────────────────────────────────────┘
Will decrement (subtract one from) the reserved argument shown.
┌─────────────────────────────────────────────────────────────────────┐
│ div NumericArgument1 by NumericArgument2 │
└─────────────────────────────────────────────────────────────────────┘
Divides the first argument shown by the second argument shown and
places the result in "result".
┌─────────────────────────────────────────────────────────────────────┐
│ draw circle │
│ draw rotated circle │
│ draw line │
└─────────────────────────────────────────────────────────────────────┘
For "draw ellipse" and "draw rotated ellipse", call with:
set wide=<Width of circle>
set hite=<Height of circle>
set color=<Color>
set angle=<Angle in degrees>
set mode=<Logical graphic function>
set col=<Column of circle center location>
set row=<Row of circle center location>
Draws an ellipse in the current color with it's center at "col" and
"row". The width of the ellipse will be equal to "wide" and the
height will be equal to "hite". If wide equals hite, then "draw
ellipse" will draw a circle. If the optional "rotate" argument is
used then the ellipse will be rotated by an angle of "angle" degrees
with respect to the x-axis. 0,0 are the coordinates for the topmost
left corner of the video screen with the coordinates increasing in
value as you go down and to the right on the screen. The routine
will draw only partial circles if any of the points fall outside the
current "xmin", "xmax", "ymin", and "ymax" settings.
For "draw line", call with:
set blank=<Number of blank points>
set col=<Beginning column>
set col2=<Ending column>
set color=<Color>
set dash1=<1st number of solid points>
set dash2=<2nd number of solid points>
set mode=<Logical graphic function>
set row=<Beginning row>
set row2=<Ending row>
Draws a line from col1,row1 to the location col2,row2. The line will
be drawn with the current color "color" and will either (xor and or
overwrite) whatever is already on the screen depending on the current
setting of the reserved argument mode (0=Unmodified 1=And 2=Or
3=Xor). Line will draw "dash1" number of pixels followed by "blank"
number of blank pixels followed by "dash2" number of pixels for the
length of the line. This allows line to draw dashed lines, solid
lines, or dash-dot lines.
For example:
Set these arguments to draw the following line (with each "-"
representing one pixel):
--- -- --- -- --- -- --- -- --- -- ---
set dash1=3─┘ ││
set blank=1────┘│
set dash2=2─────┘
a solid line would need to call draw line with this argument:
set blank=0
┌─────────────────────────────────────────────────────────────────────┐
│ end with ERRORLEVEL │
└─────────────────────────────────────────────────────────────────────┘
Ends the XYZ program with a DOS error level equal to ERRORLEVEL
(which can range from 0 to 255)
For example:
end with 3
┌─────────────────────────────────────────────────────────────────────┐
│ eof │
└─────────────────────────────────────────────────────────────────────┘
Eof stands for End Of File. When the XYZ compiler reaches this
command, it will quit compiling and ignore all text that follows this
command. This is useful for tagging extra documentation to you source
code without having to store it in another file.
┌─────────────────────────────────────────────────────────────────────┐
│ exp NumericArgument │
└─────────────────────────────────────────────────────────────────────┘
Computes e raised to the power of the numeric argument and places the
result in "result".
┌─────────────────────────────────────────────────────────────────────┐
│ ext ( TextString ) │
└─────────────────────────────────────────────────────────────────────┘
XYZ will write the following group of four hex characters directly
into the program as literal instructions:
For example:
ext ( BE01 12AC 3C1A 7408 8AD0 B402 CD21 EBF3 CD20 )
This statement will write the next 18 double digit hex characters
into the XYZ file starting at the point where the ext statement
begins. The characters shown above are the hex representation of the
machine code to perform the following commands:
mov si, offset T2+2
T1: lodsb
cmp al, 26
je T2
mov dl, al
mov ah, 02
int 21h
jmp T1
T2: int 20h
NOTE: This command is for very advanced users and is used mainly by
XYZ for patches or for doing special fucntions that users request.
Also, some EXT statements may need only two hex characters to end
the statement so the character "+" is provided as a dummy character,
since the EXT command MUST have four characters per instruction. If
the last instruction in the example above needed to end with "CD"
instead of "CD20", then the proper syntax would need to be "CD++".
┌─────────────────────────────────────────────────────────────────────┐
│ file close TextArgument/handle │
│ file create TextArgument │
│ file delete TextArgument │
│ file move TextArgument/handle │
│ file open TextArgument │
│ file read from TextArgument/handle to TextArgument │
│ file reset TextArgument/handle │
│ file set TextArgument/handle │
│ file write from TextArgument to TextArgument/handle │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set size=<Number of bytes or chars>
set start=<Postion within TextArgument where handle is stored>
All files must be specified by what are called "handles" because this
is the way DOS handles files. This "handle" is simply a two byte
binary number that DOS references for information about that file in
order to perform input or output of that file from the disk.
TextArgument will contain just a text string with the path name of
the file. TextArgument/Handle will contain the handle of the file.
"file open TextArgument" is the only command you can use to obtain a
file handle from DOS.
File will perform the following file Operations...
┌──────┬────────────────────────────────────────────────────────┐
│close │closes the file specified by the handle in TextArgument.│
├──────┼────────────────────────────────────────────────────────┤
│create│creates the file named in TextArgument. The dos file│
│ │attribute will be set to "A" or "archive". │
├──────┼────────────────────────────────────────────────────────┤
│delete│deletes the file named in TextArgument. │
├──────┼────────────────────────────────────────────────────────┤
│move │increases the file pointer by "size" bytes. │
├──────┼────────────────────────────────────────────────────────┤
│open │opens the existing file named in TextArgument. The│
│ │reserved argument "handle" will be set to the dos│
│ │handle for that file. The file pointer will be reset│
│ │for that file. │
├──────┼────────────────────────────────────────────────────────┤
│read │reads "size" number of bytes from handle of file│
│ │specified in TextArgument. The file pointer will be│
│ │incriminated by "size" or by the actual number of bytes│
│ │read. "size" will be set to the actual number of bytes│
│ │read. │
├──────┼────────────────────────────────────────────────────────┤
│reset │resets the file pointer to the beginning of the file│
│ │specified by the handle in TextArgument. │
├──────┼────────────────────────────────────────────────────────┤
│set │sets the file pointer to the end of the file specified│
│ │by the handle in TextArgument. │
├──────┼────────────────────────────────────────────────────────┤
│write │writes "size" number of bytes from handle of file│
│ │specified in TextArgument1 to TextArgument2. The file│
│ │pointer will be incriminated by "size" or by the actual│
│ │number of bytes read. "Size" will be set to the actual│
│ │number of bytes read. │
└──────┴────────────────────────────────────────────────────────┘
If any operation fails, then the reserved argument "error" will be
set to the DOS error code and the error flag will be set for the jer
command to work.
For example (assume the file README.TXT exists in the directory
C:\DOS\UTILITIES\DOS\ and reads "Scooby Dooby Doo" and is therefore
only 16 bytes in size):
dat txt 00 FileName=C:\DOS\UTILITYS\DOC\README.TXT
dat txt 00 NewText= we love you!
dat txt 00 ErrMessage=Couldn't open file!
dat txt 02 MyFile will be the handle for README.TXT
set start=1
file open FileName will open README.TXT...
jer Oops! ...unless we couldn't find it!
convert handle to MyFile
set size=16 get ready to read 16 bytes...
file read MyFile to buffer
set size=12 since NewText is 12 bytes long
file write NewText to MyFile
file reset MyFile
set size=28
file read MyFile to buffer
tty buffer
file close MyFile
end with 0 because everything went O.K.
--- Oops!
tty ErrMessage will print "Couldn't open file!" to screen.
end with 1 because we had an error!
Wow! Okay, what this example does is first open the file whose path
name is in the text argument FileName. If the file doesn't exist,
the program will detect the error and goto the subroutine Oops!
where it will end the program with an error level of 1. If not then
it will read 16 bytes\chars into the reserved text argument buffer
from the file. buffer will now contain the string "Scooby Dooby
Doo". Next, 12 bytes\chars from the text argument NewText will be
written to the file, starting from wherever the last file operation
left the file pointer at. When the file pointer is reset to 0 by
the file reset command and the file is reread into buffer, we see
that buffer will now contain the string "Scooby Dooby Doo we love
you!". Last of all, the file will be closed and the program will
exit with an error code of 0.
┌─────────────────────────────────────────────────────────────────────┐
│ find char in TextArgument │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<What position to start at>
set char=<Character to search for>
Finds a character in the text argument that matches the character
typed after char=, starting from position "start". Find counts each
character it compares until it finds the first match and then stops
and reports the location of this match in reserved argument "start"
and also reports the number of characters it searched until it found
the match in reserved argument "size".
For example:
set char=Q
set start=22
find char in TextString
will search for the letter Q in the text argument TextString,
starting at the 22nd character in TextString.
┌─────────────────────────────────────────────────────────────────────┐
│ goto LABEL │
│ goto TextArgument │
└─────────────────────────────────────────────────────────────────────┘
Go to the subroutine labeled --- LABEL.
┌─────────────────────────────────────────────────────────────────────┐
│ inc ReservedArgument │
└─────────────────────────────────────────────────────────────────────┘
Will increment (add one to) the reserved argument shown.
┌─────────────────────────────────────────────────────────────────────┐
│ input TextArgument │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<Position of first character to input in buffer>
set size=<Number of characters to receive>
Input waits for a key to be entered into the text argument. Any ASCII
character may be entered in the text string. It also returns a scan
code in the reserved argument scan if the keyboard returns a blank
(00 hex) character. This is useful for getting certain keys (like the
function keys).
For example:
set start=3
set size=24
inp TextArgument
will input a statement that will get 24 characters from the keyboard
and place it starting at the 3rd character location of TextArgument.
┌─────────────────────────────────────────────────────────────────────┐
│ int HexInterruptNumber ax= bx= cx= dx= di= si= bp= es= ds= │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<Position within TextArgument to find handle>
Performs the hex interrupt indicated. Then it sets the registers
according to the hex values set with the arguments shown in the
command above. All hex numbers must be four digits in length. The
number one would be entered as 0001 and the number 65535 would be
entered as FFFF. For setting register values to point to text
arguments, the reserved argument "start" must be set to the position
where to find the handle of a text argument within that TextArgument.
Use caution with this command if the ds or es registers will be
changed upon return of the interrupt.
For example:
set start=1
set handle=TextString
save handle to TextArgument
int 21 ax=3900 dx=TextArgument
will perform interrupt 21h, service ax=3900h (Create Subdirectory).
Upon entry, dx will contain the address to the text argument
TextString (which is always in the current data segment for XYZ).
┌─────────────────────────────────────────────────────────────────────┐
│ ior TextArgument │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<Position of first character to ior>
set size=<Number of characters to ior>
set char=<Character to ior with>
Inclusively ORs the text argument with the specified character,
starting at character number "start1". This routine will end after
size of characters have been iored.
For example:
set start=4
set size=23
set char=R
ior TextArgument
will or the text argument with the letter R starting at the 4th
character and will or 23 characters altogether.
┌─────────────────────────────────────────────────────────────────────┐
│ jeq LABEL │
│ jeq TextArgument │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<Position within Textargument to find handle>
If the result of the preceding cmp statement was EQUAL, then goto the
subroutine labeled --- LABEL in the program.
┌─────────────────────────────────────────────────────────────────────┐
│ jer LABEL │
│ jer TextArgument │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<Position within TextArgument to find handle>
If the result of the last operation caused an error, then goto the
subroutine labeled --- LABEL in the program.
┌─────────────────────────────────────────────────────────────────────┐
│ jge LABEL │
│ jge TextArgument │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<Position within Textargument to find handle>
If the result of the preceding cmp statement was GREATER than or
EQuaL, then goto the subroutine labeled --- LABEL in the program.
┌─────────────────────────────────────────────────────────────────────┐
│ jgt LABEL │
│ jgt TextArgument │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<Position within Textargument to find handle>
If the result of the preceding cmp statement was GREATER THAN, then
goto the subroutine labeled --- LABEL in the program.
┌─────────────────────────────────────────────────────────────────────┐
│ jle LABEL │
│ jle TextArgument │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<Position within Textargument to find handle>
If the result of the preceding cmp statement was LESS THAN or EQUAL,
then goto the subroutine labeled --- LABEL in the program.
┌─────────────────────────────────────────────────────────────────────┐
│ jlt LABEL │
│ jlt TextArgument │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<Position within Textargument to find handle>
If the result of the preceding cmp statement was LESS THAN, then goto
the subroutine labeled --- LABEL in the program.
┌─────────────────────────────────────────────────────────────────────┐
│ jne LABEL │
│ jne TextArgument │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<Position within Textargument to find handle>
If the result of the preceding cmp statement was NOT EQUAL, then goto
the subroutine labeled --- LABEL in the program.
┌─────────────────────────────────────────────────────────────────────┐
│ len TextArgument │
└─────────────────────────────────────────────────────────────────────┘
Gets the LENgth of the string in the TextArgument and places that
value in the reserved variable size. It starts by counting the first
character in the argument until it reaches the first "Enter"
character.
┌─────────────────────────────────────────────────────────────────────┐
│ log NumericArgument │
└─────────────────────────────────────────────────────────────────────┘
Computes the natural LOGarithm of the numeric argument and places the
result in "result".
┌─────────────────────────────────────────────────────────────────────┐
│ mouse Command │
│ mouse cursor=TextArgument │
└─────────────────────────────────────────────────────────────────────┘
is the command for controlling the mouse. The following text is a
list of the various mouse functions controlled by mouse:
┌──────┬─────────────────────────────────────────────────────────┐
│button│Will return the status of the mouse buttons. There are│
│ │two buttons (left and right) which can be in one of two│
│ │states (pressed or released). The jeq or jne command can│
│ │be used to detect whether or not a button was pressed or│
│ │released after the but command executes. Jeq is the same│
│ │as saying jump if true and jne is the same as saying jump│
│ │if false. But will also return the coordinates of the│
│ │mouse cursor hot spot to the col and row reserved│
│ │arguments (they will remain unchanged if the button being│
│ │checked had not been pressed or released since the last│
│ │call to but). Notice that when rat but is called with... │
│ ├─────────────────────────────────────────────────────────┤
│ │mouse set equal to 0, then the status of the left button│
│ │being pressed will be checked. │
│ ├─────────────────────────────────────────────────────────┤
│ │mouse set equal to 1, then the status of the right│
│ │button being pressed will be checked. │
│ ├─────────────────────────────────────────────────────────┤
│ │mouse set equal to 2, then the simultaneous status of│
│ │both buttons being pressed will be checked. │
│ ├─────────────────────────────────────────────────────────┤
│ │mouse set equal to 3, then the status of the left button│
│ │being released will be checked. │
│ ├─────────────────────────────────────────────────────────┤
│ │mouse set equal to 4, then the status of the right│
│ │button being released will be checked. │
│ ├─────────────────────────────────────────────────────────┤
│ │mouse set equal to 5, then the simultaneous status of│
│ │both buttons being released will be checked. │
├──────┼─────────────────────────────────────────────────────────┤
│cursor│Will change the graphics cursor to the graphics cursor│
│ │stored in TextArgument. The cursor must have been│
│ │created by a dat mouse statement at the beginning of the│
│ │XYZ source file. │
├──────┼─────────────────────────────────────────────────────────┤
│hide │Hides mouse cursor. │
├──────┼─────────────────────────────────────────────────────────┤
│horz │Sets the Min/Max range for the horizontal cursor│
│ │position.Called with the Min range in the col and the Max│
│ │range in the row reserved arguments. │
├──────┼─────────────────────────────────────────────────────────┤
│pen │Turns light pen on if mouse is set equal to 1 and turns│
│ │the light pen off if mouse is set equal to 0 when the pen│
│ │routine is called. │
├──────┼─────────────────────────────────────────────────────────┤
│reset │Turns on the mouse and resets it. │
├──────┼─────────────────────────────────────────────────────────┤
│show │Displays cursor. │
├──────┼─────────────────────────────────────────────────────────┤
│vert │Sets the Min/Max range for the vertical cursor position.│
│ │Called with the Min range in the row and the Max range in│
│ │the col reserved arguments. │
└──────┴─────────────────────────────────────────────────────────┘
For example:
set mouse=0
mouse button
jeq LeftButtonPressed
jne LeftButtonNotPressed
--- LeftButtonPressed
mouse cursor=NewCursor
--- LeftButtonNotPressed
end
will jump to the label "--- LeftButtonPressed" if the right button of
the mouse was pressed, load a new mouse cursor stored in the text
argument NewCursor, then quit the program. Otherwise, XYZ will jump
to the label "--- LeftButtonNotPressed" and quit.
┌─────────────────────────────────────────────────────────────────────┐
│ mul NumericArgument1 by NumericArgument2 │
└─────────────────────────────────────────────────────────────────────┘
Multiplies the first numeric argument or constant argument with the
second and places the result in "result".
┌─────────────────────────────────────────────────────────────────────┐
│ neg NumericArgument │
└─────────────────────────────────────────────────────────────────────┘
NEGates the numeric argument.
┌─────────────────────────────────────────────────────────────────────┐
│ plot │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set color=<Color>
set angle=<Angle in degrees>
set col=<Center of rotation...X position>
set row=<Center of rotation...Y position>
set col2=<Point starting...X position>
set row2=<Point starting...Y position>
Plots the current color "color" to the given Column and Row (in the
reserved arguments row2 and col2. The point will be rotated by an
angle of "angle" degrees with respect to the x-axis of the video
screen. 0,0 are the coordinates for the topmost left corner of the
video screen with the coordinates increasing in value as you go down
and to the right on the screen. The routine will not draw any points
if any of the points fall outside the current "xmin", "xmax",
"ymin", and "ymax" settings.
┌─────────────────────────────────────────────────────────────────────┐
│ prn TextArgument │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<Position of first character to Prn>
set size=<Number of characters to Prn>
set lptn=<LPTn to use>
Prints the contents of the given text argument starting at character
"start" and stopping after "size" characters have been printed.
For example:
set lptn=1
set start=2
set size=21
prn TextArgument
will print all the text stored in TextArgument (starting with the 2nd
character and ending with the 23rd) out to the printer LPT1.
NOTE: LPT numbers start at 0 and go up to 3. Most printers are
connected to LPT0 which is the default parallel or printer port that
comes with most IBM compatible computers (IBM is a trademark of IBM
Corp). The second printer will be connected to LPT1 and so on.
┌─────────────────────────────────────────────────────────────────────┐
│ push TextArgument │
│ pop TextArgument │
│ push ReservedArgument │
│ pop ReservedArgument │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<Position within TextArgument to make pop or push>
These two instructions are the most dangerous commands that you can
use. Since push will save two characters (ie -- one word, starting
at position "start" within the called text argument or will save the
reserved argument) on the executable file's stack, and since the
stack is also where the next return address for a call function is
stored, you must be sure to pop whatever you push or your program
will crash.
Pop will restore two characters (one word) starting at position
"start" within the called text argument or will restore to the
reserved argument. These characters (or word) will be restored from
whatever is on the executable file's stack.
The exception to this command is for pushing and popping the
reserved arguments "color" and "color2". This is a three character
save and restore and therefore these two reserved arguments can only
be used with each other.
┌─────────────────────────────────────────────────────────────────────┐
│ read │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set col2=<Column>
set row2=<Row>
Reads the color of the pixel at the Column and Row given by the col
and row reserved arguments and places it in the reserved argument
color2.
For example:
set col2=640
set row2=480
set color=12 00 00
read
cmp color to color2
jle Somewhere
will read the color of the pixel at location (640, 480) of the screen
and compare the color returned to the color placed in the reserved
argument "color". If it is less than or equal to that then it will
jump to the label called Somewhere.
┌─────────────────────────────────────────────────────────────────────┐
│ ret │
└─────────────────────────────────────────────────────────────────────┘
RETurns from a subroutine to the CALLing routine. See the topic
"call".
┌─────────────────────────────────────────────────────────────────────┐
│ save Textargument1 to TextArgument2 │
│ save NumericArgument1 to NumericArgument2 │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<Position of first character to Sav>
set size=<Number of characters to Sav>
set start2=<Position of first character to Sav in second argument>
Saves the contents of the first text or numeric argument (starting
with character "start" until "size" characters have been saved) by
placing it into the second text or numeric argument (starting at the
position "start2"). For the numeric arguments, "start", "size", and
"start2" have no effect.
For example:
set start=2
set size=13
set start2=3
save ThisString to ThatString
will take 13 characters of text in ThisString (starting with the 2nd
character) and save it to ThatString (starting with the 3rd
character).
┌─────────────────────────────────────────────────────────────────────┐
│ scr to TextArgument │
│ scr from TextArgument │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set wide=<Width>
set hite=<Height>
set col=<Starting Col>
set row=<Starting Row>
Copies the contents of the SCReen to memory or from memory to the
screen. The reserved argument "hite" determines the height and the
reserved argument "wide" determines the width of the area to be
copied from the screen to the memory. The starting point of the
copy routine is col,row.
┌─────────────────────────────────────────────────────────────────────┐
│ set ReservedArgument=Number <or "character"> │
│ set TextArgument=ReservedArgument │
│ set handle=<any argument or label> │
│ set tty cursor │
│ set tty blink │
│ set videomode=<see list> │
└─────────────────────────────────────────────────────────────────────┘
Sets the reserved argument equal to a number, where number equals 0
to 65535 (16,777,215 for the reserved argument color) or sets the
reserved argument equal to a single character. The number may not
exceed the range defined for that reserved argument as defined in the
section RESERVED arguments.
For example:
set angle=33000
set char=D
will set the reserved argument angle equal to 33,000 and places the
letter D in reserved argument char.
---------------------------------------------------------------------
The command "set handle=" is a special case for the set command. When
"set handle=" is used, handle will be set to the address of a label
or argument only. Set handle cannot be set to equal a character or a
number like the other reserved arguments can.
For example:
set handle=TextArgument
set handle=LABEL
---------------------------------------------------------------------
Setting the reserved arguments "color" or "color2" is also a special
case in that you must list three 2-digit hex numbers in a row like
this:
set color=XX YY ZZ
The reason for using hex numbers is because almost all computer
reference books list colors in terms of hex numbers. This way you
won't have to convert from hex to decimal or vice versa, when doing
research on these various modes:
In text modes XX should equal the color
YY should equal the page number
ZZ should equal 00
In 16 color modes XX should equal the color
YY should equal 00
ZZ should equal 00
In 256 color modes XX should equal the color
YY should equal 00
ZZ should equal 00
In SVGA modes XX should equal the red color component
YY should equal the green color component
ZZ should equal the blue color component
---------------------------------------------------------------------
For the "set tty cursor" and "set tty blink", call with:
set color=<Color and attribute of character to print>
set start=<Position of first character to print>
set size=<Number of characters to print>
set col=<Cursor column>
set row=<Cursor row>
set mode=<1 or 0>
To change the cursor position, use the "set tty cursor" option to set
the cursor to the coordinates specified by the reserved arguments
"row" and "col".
To change the character attribute in text modes or change the
character color in graphics modes, use the reserved argument "color"
set to a number from 00-FF (See Appendix)
To change the available attribute from blinking colors to high
intensity colors (in text modes only), use the "set tty blink" option
with "mode" set to 1 for using blinking attributes or to 0 for
high-intensity attributes.
For example:
set col=0
set row=0
set tty cursor
set mode=0
set tty blink
set color=135
set start=1
set size=99
tty ThisString
will place the cursor at the topmost left corner of the screen. Then
it will choose high intensity attributes meaning that the color
number 135 will be high-intensity white on a black background. It
will print text to the screen, starting from the first character in
the text argument ThisString until it finishes printing 99
characters (about two rows).
---------------------------------------------------------------------
For the "set videomode=" command, XYZ currently supports the
following EGA/VGA video modes (Where A equals Mode, B equals Number
of colors, C equals Rows x Columns, and D equals Type of video
displayed):
┌───┬─────┬─────────┬────────┐
│ A│ B│ C│ D│
├───┼─────┼─────────┼────────┤
│ 2│ 16│ 80x25│ Text│
│ 3│ 16│ 80x25│ Text│
├───┼─────┼─────────┼────────┤
│ 13│ 256│ 320x200│Graphics│
├───┼─────┼─────────┼────────┤
│ 10│ 16│ 640x350│Graphics│
├───┼─────┼─────────┼────────┤
│ 12│ 16│ 640x480│Graphics│
└───┴─────┴─────────┴────────┘
and the following Super VGA video modes:
┌───┬─────┬─────────┬────────┐
│108│ 16│ 80x60│ Text│
│109│ 16│ 132x25│ Text│
│10A│ 16│ 132x43│ Text│
│10B│ 16│ 132x50│ Text│
│10C│ 16│ 132x60│ Text│
├───┼─────┼─────────┼────────┤
│101│ 256│ 640x480│Graphics│
│110│ 32K│ 640x480│Graphics│
│111│ 64K│ 640x480│Graphics│
│112│16.8M│ 640x480│Graphics│
├───┼─────┼─────────┼────────┤
│102│ 16│ 800x600│Graphics│
│103│ 256│ 800x600│Graphics│
│113│ 32K│ 800x600│Graphics│
│114│ 64K│ 800x600│Graphics│
│115│16.8M│ 800x600│Graphics│
├───┼─────┼─────────┼────────┤
│105│ 256│ 1024x768│Graphics│
│116│ 32K│ 1024x768│Graphics│
│117│ 64K│ 1024x768│Graphics│
│118│16.8M│ 1024x768│Graphics│
├───┼─────┼─────────┼────────┤
│107│ 256│1280x1024│Graphics│
│119│ 32K│1280x1024│Graphics│
│11A│ 64K│1280x1024│Graphics│
│11B│16.8M│1280x1024│Graphics│
└───┴─────┴─────────┴────────┘
XYZ Super VGA modes are based on the VESA standard and it must be
loaded in either AUTOEXEC.BAT, CONFIG.SYS, or is included in the
video board hardware.
The VGA/EGA graphics modes 2-13 and modes 108-10C have what are
called color palettes. This color palette is filled with as many
colors as that mode will support. Sixteen color modes will have a
sixteen color palette with each color numbered 00 through 0F. 256
color modes will have a 256 color palette with each color numbered
00 through FF. The colors defined by each number are predefined by
the VGA/EGA standard. For all other graphics modes, the colors are
defined by the actual number placed on the screen by the plot
routine. See appendix A for charts on the actual definitions of
colors for the various modes.
As of this writing, there is no support for the mouse graphics
cursor in Super VGA modes because no standard has been adopted yet
by all manufacturers that will allow programmers to have access to
the mouse cursor in Super VGA modes. My options are to write a
non-standard interface for you, wait for manufacturers to come out
with a standard, or provide source code on how to write your own
interface. If you don't mind, please drop me a line and let me know
which option you think would be best.
┌─────────────────────────────────────────────────────────────────────┐
│ slm Mode │
└─────────────────────────────────────────────────────────────────────┘
Sets the Line Mode for text modes (if possible) to 23, 43, or 50
line mode. The screen will be cleared after the slm command has been
used.
For example:
slm 50
will set the current text mode display to 50 lines if I am in
video mode 2 or 3.
┌─────────────────────────────────────────────────────────────────────┐
│ snd │
│ snd off │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set freq=<Freq>
Modulates the pc speaker with the specified frequency in the
reserved argument freq. Once a frequency is set the speaker will
continue to Sound until another snd statement is encountered that
either changes the frequency or turns it off.
For example:
set freq=256
snd
will cause the PC speaker to oscillate at 256 hertz.
┌─────────────────────────────────────────────────────────────────────┐
│ sub NumericArgument2 from NumericArgument1 │
└─────────────────────────────────────────────────────────────────────┘
SUBtracts the arguments shown and places the result in "result".
For example:
sub NumericArgument2 from NumericArgument1
┌─────────────────────────────────────────────────────────────────────┐
│ tty TextArgument │
└─────────────────────────────────────────────────────────────────────┘
Prints the given text argument to the screen. The ASCII codes for the
bell(07), the backspace(08), the linefeed(10), and the carriage
return(13) are translated to the appropriate actions. Line wrap and
scrolling are also performed automatically. In graphics modes, tty
will only print out to the monitor using color codes 1 - 255 (See the
chart in appendix A).
┌─────────────────────────────────────────────────────────────────────┐
│ wait ## │
└─────────────────────────────────────────────────────────────────────┘
Wait will do nothing until ## of DOS ticks have elapsed. One DOS tick
is equal to 55mS and is the same on all IBM compatible computers. If
## equals 18, then wait will do nothing until one second has elapsed.
This is useful for automatic pausing before resuming a task. The
maximum number of DOS ticks is 65535 which is about one hour.
┌─────────────────────────────────────────────────────────────────────┐
│ xor TextArgument with Character │
│ xor TextArgument1 with TextArgument2 │
└─────────────────────────────────────────────────────────────────────┘
CALL WITH:
set start=<Position of first character to Xor>
set size=<Number of characters to Xor>
set char=<Character to Xor with>
XORs the given text argument with the specified character, starting
at character number "start". This routine will end after "size" of
characters have been XORed unless the second argument is another text
argument. Then the first text argument will be XORed with the second
text argument until starting at character number "start" until all
characters have been used up in either the first or second arguments.
For example:
set start=4
set size=23
set char=R
xor TextArgument
will xor the text argument with the letter R starting at the 4th
character and will xor 23 characters altogether.
╔═════════════════════════════════════════════════════════════════════╗
║ XYZ COMPILE TIME ERROR MESSAGES: ║
╚═════════════════════════════════════════════════════════════════════╝
"Error on line number ##"
Shows on which line in the source file that the error occurred.
Line number 0 is the command line.
"...unable to open file!"
Possibly the wrong file name was typed in on the DOS command line.
"...file must start with numeric size!"
All XYZ source files start with a number. See the topic titled
"Sample programs to compile" for an example.
"...incorrect use of XYZ command!"
Usually a reserved argument was misspelled or missing.
"...nonexistent argument was given!"
An argument was expected but there was none. Check syntax for that
command.
"...argument must be numeric!"
"...argument must be text!"
"...nonexistent label was given!"
The label called out for wasn't found.
"...argument types don't match!"
Arguments must both be numeric or text or reserved.
"...file size greater that 64k!"
Maximum size of an XYZ program is 64k.
"...too many characters on the command line!"
Maximum number of characters per line in the source file is 111
characters.
"...argument must be a label!"
"...argument must equal 25, 43, or 50!"
"...nonexistent command was given!"
Usually a command was misspelled or missing.
╔═════════════════════════════════════════════════════════════════════╗
║ Reporting bugs or giving advice ║
╚═════════════════════════════════════════════════════════════════════╝
You do not have to be a registered user to report bugs or give
advice. Any input you give to me will be appreciated, although I
probably won't be able to respond to you personally, depending on
the number of responses I get. The kind of advice I would like to
see would be something like:
How to make the programs more readable
How to explain a command simpler
New commands to make XYZ easier or more convenient
And so on...
Please send your comments to:
XYZ
PO BOX #40943
Tempe, AZ 85274
You can also leave comments on the Internet at xyz@netzone.com
Some examples of some ideas that have already been suggested are:
Add complex number calculation capability
Make dat statements that can do arrays
Enable extended memory to be usable for storing data
If enough people respond, I will implement these suggestions with the
next release of XYZ.
╔═════════════════════════════════════════════════════════════════════╗
║ Controlling the flow of code ║
╚═════════════════════════════════════════════════════════════════════╝
For my next trick, I am going teach you how to train your program to
jump through loops and do other things at your bidding. The most
important part of the code you write is going to be centered around
three things: loops, jumps, and calls. Most programs you will see are
always doing something even when they appear to not be doing
anything. What they are doing is waiting for the user to press a
key or click a mouse button. The computer "waits" by doing a loop
and continously checking for input from the user. What is a loop and
how do I make one? Glad you asked...here is a typical loop:
dat txt 01 "Q"_Character=Q
dat txt Prompt=Type a key (Q=quit)
dat txt Text
set color=0A 00 00
set size=1
set start=1
set start2=1
--- Loop ────────────────┐
tty Prompt │
input Text │
cmp Text to "Q"_Character │
jne Loop ────────────────┘
end with 1
This loop does "nothing" but continuously prompt your end user to
type an key. Not until the user types a Q, will the program end. Not
very useful but it does illustrate what a loop is. The key parts to
a loop are the jump instruction and the label. You will have to make
many loops for your your program to function well so it can check
many things such as keyboard status and mouse stautus among other
things.
Sometimes, you will have to make a decision about what you want your
program to do next depending on what your user wants to do next. At
that point you will need to branch or jump to another part of the
program and continue operating from there before returning to the
starting code.
--- Loop ─────────────────────────┐
input Text │ │
cmp Text to "Q"_Character │ │
jeq EndProgram │ │
cmp Text to "C"_Character │ │
jeq Function#1 │ │
cmp Text to "D"_Character │ │
jne Loop ────────────────┘ │
--- ContinueHere ────────────────┐ │
call Function#2 │ │
jmp Loop ────────────────────────│─┘
--- Function#1 │
mul Firstnumber with Secondnumber │
jmp ContinueHere ────────────────┘
--- Function#2
draw line
ret ...return to the line following the command that called us
--- EndProgram
end with 1
Notice the two ways that a function can be used. Function#1 ends
with a jmp instruction and if it is used, it will always return to
the same place (ContinueHere). If the "call" command is used to use
a function that ends with a "ret" command, then ANY part of the
program that calls it will return where it left off.
Another thing that you might want to do with loops is to cycle
through a loop for a certain amount of times before exiting.
dat txt HiWorld=Hello World!
set usr1=5
set color=0A 00 00
set start=1
set size=14
--- Loop ──┐
tty HiWorld │
dec usr1 │
jne Loop ──┘
end with 1
This segment of code will loop until usr1=0 (hence the jne, which is
used without a "cmp" command, is the equivalent of jump if not equal
to zero). In other words, it will print out "Hello World!" five
times before quitting.
╔═════════════════════════════════════════════════════════════════════╗
║ Sample programs to compile ║
╚═════════════════════════════════════════════════════════════════════╝
The general outline of a typical XYZ file is as follows:
000 General Outline:
dat mouse XXXX
dat num XXXX
dat txt XXXX
.
.
.
source code
/// Don't forget comments!
.
.
.
end with XX (could be anywhere in the file)
eof
Additional documentation may be added here.
Now for a short explanation:
1. The first line must start with a three digit number that will
determine how many digits will display for calculations done
with the math functions.
2. Next, all data that will be used in the program needs to be
initialized or defined.
3. After all data has been defined or initialized, then comes the
"meat" of the program, which is your main program.
4. The best way to quit you programs is with a "end with XX"
command where XX equals a number from 0 to 255. You can
optionally end your program with a "ret" command (if no "call"
or "push" commands were used prior to the "ret" command is
called) but it is not recommended.
5. At the end of all of your SOURCE CODE, I would highly recommend
that you type the word "eof". XYZ will end it's compilation and
totally ignore any text that you add on the next line or any
line thereafter. This may be a good way to add documentation to
your program without having to keep it in a seperate file.
6. You should thoroughly add comments to you source code wherever
possible.
Here are the few sample programs I mentioned earlier: Copy these
sample programs to a separate file and compile them with the XYZ
compiler. Some programs may need to be edited to fit in less than 30
lines of source code, IF you are compiling with the shareware
version of XYZ.
000 This is a sample test file for various mouse cursors
/// The compiled version of this program can be found
/// under the name "rat.com" in this directory.
dat mouse GunSight 0007 0007
dat ....** . **.....
dat ..** . **...
dat .** . **..
dat .* . *..
dat * . *.
dat * . *.
dat . .
dat ................
dat . .
dat * . *.
dat * . *.
dat * . *.
dat .* . *..
dat .** . **..
dat ..** . **...
dat ....** . **.....
dat mouse crosshair 0006 0006
dat ......*.........
dat .....*o*........
dat .....*o*........
dat .....*o*........
dat .....*o*........
dat .*****.*****....
dat *oooo...oooo*...
dat .*****.*****....
dat .....*o*........
dat .....*o*........
dat .....*o*........
dat .....*o*........
dat ......*.........
dat ................
dat ................
dat ................
dat mouse downarrow 0015 0005
dat ...*****........
dat ...*ooo*........
dat ...*ooo*........
dat ...*ooo*........
dat ...*ooo*........
dat ...*ooo*........
dat ...*ooo*........
dat ...*ooo*........
dat ...*ooo*........
dat ...*ooo*........
dat ****ooo****.....
dat *ooooooooo*.....
dat .*ooooooo*......
dat ..*ooooo*.......
dat ...*ooo*........
dat ....*o*.........
dat mouse lefthand 0005 0001
dat ................
dat ................
dat ......ooooooooo.
dat ......o********o
dat oooooooooo*****o
dat o**************o
dat ooooooooo******o
dat ....o**********o
dat ....ooooo******o
dat ....o**********o
dat ....ooooo******o
dat .....o********oo
dat .....oooooooooo.
dat ................
dat ................
dat ................
dat mouse hourglass 0007 0007
dat .*************..
dat *ooooooooooooo*.
dat .*o*********o*..
dat .*o*********o*..
dat ..*o*o*o*o*o*...
dat ...*o*o*o*o*....
dat ....*o*o*o*.....
dat ....*o***o*.....
dat ..**o**o**o**...
dat ..*o*******o*...
dat .*o****o****o*..
dat .*o***o*o***o*..
dat *ooooooooooooo*.
dat .*************..
dat ................
dat ................
set videomode=12 ...which is the 640x480x16 color mode
mouse cursor=GunSight
mouse show
int 16 ax=0000 is the BIOS wait for keypress function
mouse hide
mouse cursor=crosshair
mouse show
int 16 ax=0000
mouse hide
mouse cursor=downarrow
mouse show
int 16 ax=0000
mouse hide
mouse cursor=lefthand
mouse show
int 16 ax=0000
mouse hide
mouse cursor=hourglass
mouse show
int 16 ax=0000
mouse hide
end with 1
eof
This next example file demonstrates a few of the functions of XYZ.
Notice how small this file compiles! How many compilers do you know
of that would perform the same functions as this one in only 5885
bytes? Enjoy...
053 This is a demonstration file
/// The compiled version of this file can be found
/// under the name "sample.com" in this directory.
dat txt sample.xyz=xyz101s.doc
dat txt $tring=The sin of 2 =
dat txt error=
File not found!
dat num number=2
/// Demonstrate graphics
set videomode=12 which is the 640x480x16 color mode
set wide=100
set hite=200
set color=0B 00 00 = bright blue
set angle=-45 degrees
set mode=0
set col=320
set row=240
draw rotated ellipse
set blank=3
set dash1=3
set dash2=6
/// This sets row2=row...
push row
pop row2
set col2=639
draw line
int 16 ax=0000 This interrupt will pause until a key is pressed
set videomode=3 which is normal text mode
/// Demonstrate math capability
set color=0A 00 00 = bright green
set start=1
set size=20
tty $tring
sin number
convert result to buffer
tty buffer
/// Demonstrate file command
file open sample.xyz
jer Error!
/// I could have set up a Critical Error Handler instead of "jer"
set size=27
file read from handle to buffer
set col=0
set row=1
set tty cursor
tty buffer
file reset handle
set size=27
file read from handle to buffer
set mode=1
set tty blink to enable a blinking cursor
set col=0
set row=2
set color=8A 00 00 = blinking bright green
set tty cursor
tty buffer
file close handle
end with 0
--- Error! ...the program will go here if xyz101s.doc not found.
set size=25
set mode=1
set tty blink to enable a blinking cursor
set color=8C 00 00 = blinking bright red
tty error
end with 255
eof
╔═════════════════════════════════════════════════════════════════════╗
║ Becoming a registered user ║
╚═════════════════════════════════════════════════════════════════════╝
If you have enjoyed using XYZ, then you are welcome to register it
for $30. This $30 will enable you to use it to compile and register
your own programs for fun or profit. Without this registration
process, any programs you compile with it remain the property of the
owner(s) of the XYZ software application product. See the topic "XYZ
License Agreement" for more information.
Please send your registration fee to:
XYZ
PO BOX #40943
Tempe, AZ 85274
Make check(s) payable to: Andrew Robinson
Soon to be released are:
* A 32-bit version of XYZ
* An XYZ debugger for troubleshooting your compiled programs
* A Windows95 compiler written as an XYZ application
For Corporate registrations, the registration fee will be $300. For
international corporate registrations, the registration fee will be
$1000.
Windows95 is a trademark of Microsoft Corp.
╔═════════════════════════════════════════════════════════════════════╗
║ APPENDIX: ║
╚═════════════════════════════════════════════════════════════════════╝
┌─────────────────────────────────────────────────────────────────────┐
│ Table of Scan Codes for 101/102-Key Keyboard (in hexadecimal): │
└─────────────────────────────────────────────────────────────────────┘
Main keyboard:
┌───┐┌──┬──┬──┬──┐┌──┬──┬──┬──┐┌──┬───┬───┬───┐┌───┬───┬───┐
│Esc││F1│F2│F3│F4││F5│F6│F7│F8││F9│F10│F11│F12││Prt│Scl│Paw│
│ 01││3B│3C│3D│3E││3F│40│41│42││43│ 44│ 57│ 58││ │ 57│ │
└───┘└──┴──┴──┴──┘└──┴──┴──┴──┘└──┴───┴───┴───┘└───┴───┴───┘
┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──────┐┌───┬───┬───┐
│` │ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│ 9│ 0│ -│ =│── ││Ins│Hom│PgU│
│29│02│03│04│05│06│07│08│09│0A│0B│0C│0D│ 0E ││*52│*47│*49│
├──┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─────┤├───┼───┼───┤
│Tab│ Q│ W│ E│ R│ T│ Y│ U│ I│ O│ P│ [│ ]│ ││Del│End│PgD│
│ 0F│10│11│12│13│14│15│16│17│18│19│1A│1B│ ││*53│*4F│*51│
├───┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┴┬─┘ │└───┴───┴───┘
│Caps│ A│ S│ D│ F│ G│ H│ J│ K│ L│ ;│ '│ ENTER │
│ 3A │1E│1F│20│21│22│23│24│25│26│27│28│ 1C ─┘│
├────┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴────┬──┤┌───┐
│Shift │ Z│ X│ C│ V│ B│ N│ M│ ,│ .│ /│Shift│\ ││ │
│ 2A │2C│2D│2E│2F│30│31│32│33│34│35│ 36 │2B││*48│
├────┬─┴┬─┴──┼──┴──┴──┴──┴──┴──┴┬─┴──┼───┬─┴──┤┌───┼───┼───┐
│Ctrl│ │Alt │ Space Bar │Alt │ │Ctrl││ │ │ │
│ 1D │ │ 38 │ 39 │*38 │ │*10 ││*4B│*50│*40│
└────┘ └────┴──────────────────┴────┘ └────┘└───┴───┴───┘
Numeric keypad:
┌───┬───┬───┬───┐
│Num│ / │ * │ - │
│ 45│*36│ 37│ 4A│
├───┼───┼───┼───┤
│ 7 │ 8 │ 9 │ │
│ 47│ 48│ 49│ + │
├───┼───┼───┤ 4E│
│ 4 │ 5 │ 6 │ │
│ 4B│ 4C│4D │ │
├───┼───┼───┼───┤
│ 1 │ 2 │ 3 │ │
│ 4F│ 50│ 51│─┘│ Notes:
├───┴───┼───┤*1C│ * = E0
│ Ins │Del│ │ Prt = E0 2A E0 37
│ 52 │ 53│ │ Paw (pause) = E0 10 45
└───────┴───┴───┘ Scan Codes for 84 or 83-Key Keyboards are the same.
┌─────────────────────────────────────────────────────────────────────┐
│ Table of video modes and their default colors: │
└─────────────────────────────────────────────────────────────────────┘
For sixteen color video/text modes:
┌──────────────────┬──────────────────┐
│ Background Hex │Foreground Hex │
│ Color Value│ Color Value │
├──────────────────┼──────────────────┤
│ Black 0 │ Black 0 │
│ Blue 1 │ Blue 1 │
│ Green 2 │ Green 2 │
│ Cyan 3 │ Cyan 3 │
│ Red 4 │ Red 4 │
│ Magenta 5 │ Magenta 5 │
│ Brown 6 │ Brown 6 │
│ White 7 │ White 7 │
│ Black blink 8 │ Dark gray 8 │
│ Blue blink 9 │ Light blue 9 │
│ Green blink A │ Light green A │
│ Cyan blink B │ Light cyan B │
│ Red blink C │ Light red C │
│ Magenta blink D │ Light magenta D │
│ Brown blink E │ Yellow E │
│ White blink F │ Bright white F │
└──────────────────┴──────────────────┘
Some sample colors for the 16.8M color modes:
Black = 00 00 00
Blue = 00 00 FF
Brown = 7F 29 29
Chocolate = D1 69 1E
Cyan = 00 FF FF
Flesh = FF 7D 40
Gold = FF D7 00
Green = 00 64 00
Grey = 6F 6F 6F
Hotpink = FF 6A 64
Indigo = 08 2E 54
Ivory = FF FF F0
Lightgrey = D3 D3 D3
Magenta = FF 00 FF
Maroon = 60 2F 60
Olive = 3B 5E 2B
Orange = FF 80 00
Purple = A0 20 F0
Red = FF 00 00
Skyblue = 87 CE FA
Tan = D2 64 8C
Turquoise = 40 E0 D0
Violet = 8E 5E 99
White = FF FF FF
Yellow = FF FF 00
┌─────────────────────────────────────────────────────────────────────┐
│ Table of ASCII codes: │
└─────────────────────────────────────────────────────────────────────┘
┌───────────────────────────────────────────────────────────────┐
│ 0 Nul 32 BL 64 @ 96 ` 128 Ç 160 á 192 └ 224 α │
│ 1 33 ! 65 A 97 a 129 ü 161 í 193 ┴ 225 ß │
│ 2 34 " 66 B 98 b 130 é 162 ó 194 ┬ 226 Γ │
│ 3 35 # 67 C 99 c 131 â 163 ú 195 ├ 227 π │
│ 4 36 $ 68 D 100 d 132 ä 164 ñ 196 ─ 228 Σ │
│ 5 37 % 69 E 101 e 133 à 165 Ñ 197 ┼ 229 σ │
│ 6 38 & 70 F 102 f 134 å 166 ª 198 ╞ 230 µ │
│ 7 39 ' 71 G 103 g 135 ç 167 º 199 ╟ 231 τ │
│ 8 40 ( 72 H 104 h 136 ê 168 ¿ 200 ╚ 232 Φ │
│ 9 TAB 41 ) 73 I 105 i 137 ë 169 ⌐ 201 ╔ 233 Θ │
│ 10 LF 42 * 74 J 106 j 138 è 170 ¬ 202 ╩ 234 Ω │
│ 11 43 + 75 K 107 k 139 ï 171 ½ 203 ╦ 235 δ │
│ 12 FF 44 , 76 L 108 l 140 î 172 ¼ 204 ╠ 236 ∞ │
│ 13 CR 45 - 77 M 109 m 141 ì 173 ¡ 205 ═ 237 φ │
│ 14 46 . 78 N 110 n 142 Ä 174 « 206 ╬ 238 ε │
│ 15 47 / 79 O 111 o 143 Å 175 » 207 ╧ 239 ∩ │
│ 16 48 0 80 P 112 p 144 É 176 ░ 208 ╨ 240 ≡ │
│ 17 49 1 81 Q 113 q 145 æ 177 ▒ 209 ╤ 241 ± │
│ 18 50 2 82 R 114 r 146 Æ 178 ▓ 210 ╥ 242 ≥ │
│ 19 51 3 83 S 115 s 147 ô 179 │ 211 ╙ 243 ≤ │
│ 20 52 4 84 T 116 t 148 ö 180 ┤ 212 ╘ 244 ⌠ │
│ 21 53 5 85 U 117 u 149 ò 181 ╡ 213 ╒ 245 ⌡ │
│ 22 54 6 86 V 118 v 150 û 182 ╢ 214 ╓ 246 ÷ │
│ 23 55 7 87 W 119 w 151 ù 183 ╖ 215 ╫ 247 ≈ │
│ 24 56 8 88 X 120 x 152 ÿ 184 ╕ 216 ╪ 248 ° │
│ 25 57 9 89 Y 121 y 153 Ö 185 ╣ 217 ┘ 249 ∙ │
│ 26 58 : 90 Z 122 z 154 Ü 186 ║ 218 ┌ 250 · │
│ 27 59 ; 91 [ 123 { 155 ¢ 187 ╗ 219 █ 251 √ │
│ 28 60 < 92 \ 124 | 156 £ 188 ╝ 220 ▄ 252 ⁿ │
│ 29 61 = 93 ] 125 } 157 ¥ 189 ╜ 221 ▌ 253 ² │
│ 30 62 > 94 ^ 126 ~ 158 ₧ 190 ╛ 222 ▐ 254 ■ │
│ 31 63 ? 95 _ 127 159 ƒ 191 ┐ 223 ▀ 255 BL│
└───────────────────────────────────────────────────────────────┘
Notes:
All codes are in decimal.
BL = Blank
LF = line feed (goto next line)
FF = form feed (goto next page)
CR = carriage return (goto first char on current line)
TAB = goto next tab stop
┌─────────────────────────────────────────────────────────────────────┐
│ List of some common DOS 21h interrupts: │
└─────────────────────────────────────────────────────────────────────┘
Auxiliary input
Call with: AX=0300h
Returns : AL=ASCII code for character
----------------------------------------------------------------------
Auxiliary output
Call with: AX=0400h
DL=ASCII code for character
----------------------------------------------------------------------
Character input with buffer
Call with: AX=0A00h
DS:DX=segment:offset of buffer
----------------------------------------------------------------------
Character input without buffer (clears buffer)
Call with: AX=0C01h or
AX=0C06h or
AX=0C07h or
AX=0C08h or
AX=0C0Ah
Returns : If AL not=0C0Ah
AL=ASCII code for character
If AL=0C0Ah
DS:DX=segment:offset of input buffer
----------------------------------------------------------------------
Character input with echo
Call with: AX=0100h
Returns : AL=ASCII code for character
----------------------------------------------------------------------
Character input without echo (unfiltered)
Call with: AX=0700h
Returns : AL=ASCII code for character
----------------------------------------------------------------------
Character input without echo
Call with: AX=0800h
Returns : AL=ASCII code for character
----------------------------------------------------------------------
Character output
Call with: AX=0200h
DL=ASCII code for character
----------------------------------------------------------------------
Character string, Output
Call with: AX=0900h
DS:DX=segment:offset of string
----------------------------------------------------------------------
Check input status
Call with: AX=0B00h
Returns : If no character is available AL=00h
If at least one character is available AL=FFh
----------------------------------------------------------------------
Create new Program Segment Prefix (PSP)
Call with: AX=2600h
Returns : DX=Segment of new program segment prefix
----------------------------------------------------------------------
Direct console I/O
Call with: AX=0600h
DX=0000h-00FEh (if output request)
DX=00FFh (if input request)
Returns : If called with DL=00FFh and a character is ready:
Zero flag=clear
AL=ASCII code for character
If called with DL=00FFh and no character is ready
Zero flag=set
----------------------------------------------------------------------
Disk, Get allocation information about
Call with: AX=3600h
DX=Drive code (0000=default, 0001=A,...)
Returns : If drive valid...
AX=Sectors per cluster
BX=Number of available clusters
CX=Bytes per sector
DX=Clusters per drive
If drive invalid AX=FFFFh
----------------------------------------------------------------------
Disk, Get current
Call with: AX=1900h
Returns : AL=Drive code (0=A, 1=B,...)
----------------------------------------------------------------------
Disk, Get data on
Call with: AX=1B00h for default drive
Returns : If invalid drive or critical error AL=FFh
Else AL=Sectors per cluster
DS:BX=segment:offset of media ID byte
CX=Size of physical sector (bytes)
DX=Number of clusters for default drive
----------------------------------------------------------------------
Disk, Read sector from (Interrupt 25h, ignoring logical structure)
Call with: AX=Drive number (0000=A, 0001=B,...)
DX=Starting sector number
If partitions <= 32 megabytes
CX=Number of sectors to read and
DS:BX=segment:offset of buffer
If partitions > 32 megabytes [Version 4.0+]
CX=-1 and
DS:BX=segment:offset of parameter block
Returns : If function successful Carryflag=clear
If function unsuccessful
Carry flag=set
AX=Error code
----------------------------------------------------------------------
Disk, Reset
Call with: AX=0D00h
----------------------------------------------------------------------
Disk, Select
Call with: AH=0Eh
AL=Number of logical drives in system
DX=Drive code (0000=A, 0001=B,...)
----------------------------------------------------------------------
Disk, Write sector to (Interrupt 26h, ignoring logical structure)
Call with: AX=Drive number (0000=A, 0001=B,...)
DX=Starting sector number
If partitions <= 32 megabytes
CX=Number of sectors to write and
DS:BX=segment:offset of buffer
If partitions > 32 megabytes [Version 4.0+]
CX=-1 and
DS:BX=segment:offset of parameter block
Returns : If function successful Carryflag=clear
If function unsuccessful
Carryflag=set
AX=Error code
----------------------------------------------------------------------
Duplicate handle
Call with: AX=4500h
BX=Handle to be duplicated
Returns : If duplicated
Carry flag=clear
AX=New handle
If not
Carry flag=set
AX=04h or 06h Error code
----------------------------------------------------------------------
Execute program
Call with: AX=4B00h to load and execute program
AX=4B03h to load overlay
DS:DX=segment:offset of program specification
Returns : If program executed Carry flag=clear upon return
Note: CS:IP must be preserved
If not
Carry flag=set
AX=01h, 02h, 03h, 05h, 08h, 0Ah, or 0Bh Error codes
----------------------------------------------------------------------
File directory, Create
Call with: AX=3900h
DS:DX=segment:offset of ASCIIZ path name
Returns : If directory created Carry flag=clear
If directory not created
Carry flag=set
AX=0003h or 0005h Error code
----------------------------------------------------------------------
File directory, delete
Call with: AX=3A00h
DS:DX=segment:offset of ASCIIZ path name
Returns : If directory deleted Carry flag=clear
If directory not deleted
Carry flag=set
AX=03h, 05h, or 10h Error code
----------------------------------------------------------------------
File directory, Find first file in
Call with: AX=4E00h
CX=Attribute to use in search
1 =Read-only
2 =Hidden
4 =System
8 =Volume label
10h=Directory
20h=Archive
DS:DX=segment:offset of ASCIIZ path name
Returns : If first file found
Carry flag=clear
Disk transfer area (DTA) will be filled in as follows:
Byte# 00h-14h=0 (Reserved)
Byte# 15h=Attribute of matched file or directory
Byte# 16h-17h=Packed file time
Byte# 18h-19h=Packed file date
Byte# 1Ah-1Dh=File size
Byte# 1Eh-2Ah=ASCIIZ filename
If not
Carry flag=set
AX=02h, 03h, or 12h Error codes
----------------------------------------------------------------------
File directory, Find next file in
Call with: AX=4F00h
Assumes previous call to Int 21 Function 4Eh or 4Fh
Returns : If next file found
Carry flag=clear
DTA filled in
If not
Carry flag=set
AX=12h Error code
Note : Disk transfer area (DTA) will be filled in as follows...
Byte# 00h-14h=0 (Reserved)
Byte# 15h=Attribute of matched file or directory
Byte# 16h-17h=Packed file time
Byte# 18h-19h=Packed file date
Byte# 1Ah-1Dh=File size
Byte# 1Eh-2Ah=ASCIIZ filename
----------------------------------------------------------------------
File directory, Get current
Call with: AX=4700h
DX=Drive code (000=default, 0001=A,...)
DS:SI=segment:offset of 64-byte buffer
Returns : If successful
Carry flag=clear
buffer is filled in with full path name
If not
Carry flag=set
AX=0Fh Error code
----------------------------------------------------------------------
File directory, Set current
Call with: AX=3B00h
DS:DX=segment:offset of ASCIIZ path name
Returns : If successful Carry flag=clear
If unsuccessful
Carry flag=set
AX=3 Error code
----------------------------------------------------------------------
File, Close
Call with: AX=3E00h
BX=Handle
Returns : If file closed Carry flag=clear
If file still open
Carry flay=set
AX=06h Error code
----------------------------------------------------------------------
File, Commit (forces buffer to be written out)
Call with: AX=6800h
BX=Handle
Returns : If file commited Carry flag=clear
If not
Carry flag=set
AX=Error code
----------------------------------------------------------------------
File, Create
Call with: AX=3C00h
CX=File attribute...
1 =Read-only
2 =Hidden
4 =System
8 =Volume label
20h=Archive
DS:DX=segment:offset of ASCIIZ path name
Returns : If file created
Carry flag=clear
AX=Handle
If file not created
Carry flag=set
AX=3, 4, or 5 Error code
----------------------------------------------------------------------
File, Create temporary
Call with: AX=5A00h
CX=Attribute
1 =Read-only
2 =Hidden
4 =System
8 =Volume label
20h=Archive
DS:DX=segment:offset of ASCIIZ path name
Returns : If file created
Carry flag=clear
AX=Handle
DS:DX=segment:offset of complete ASCIIZ path name
If not
AX=03h, 04h, or 05h Error codes
----------------------------------------------------------------------
File, Create new
Call with: AX=5B00h
CX=Attribute
1 =Read-only
2 =Hidden
4 =System
8 =Volume label
20h=Archive
DS:DX=segment:offset of ASCIIZ path name
Returns : If file created
Carry flag=clear
AX=Handle
DS:DX=segment:offset of complete ASCIIZ path name
If not
AX=03h, 04h, 05h, or 50h Error codes
----------------------------------------------------------------------
File, Delete
Call with: AX=4100h
DS:DX=segment:offset of ASCIIZ path name
Returns : If deleted Carry flag=clear
If not deleted
Carry flag=set
AX=02h, 03h, or 05h Error code
----------------------------------------------------------------------
File, Extended open, create, or replace File for DOS Version 4.0+
Call with: AH=6C00h
BX=Open mode
Access type...
0=read-only
1=write-only
2=read/write
Sharing mode...
0 =compatibility
10h=deny read/write
20h=deny write
30h=deny read
40h=deny none
Inheritance...
0 =child process inherits handle
80h=child does not inherit handle
Critical error handling...
0 =execute Int 24h
2000h=return error to process
Write-through...
0 =writes may be buffered and deferred
4000h=physical write at request time
CX=File attribute
1 =read-only
2 =hidden
4 =system
8 =volume label
20h=archive
DX=Open flag
Action if file exists...
0=fail
1=open file
2=replace file
Action if file doesn't exist...
0=fail
80h=create file
DS:SI=segment:offset of ASCIIZ path name
Returns : If function successful
Carry flag=clear
AX=Handle
CX=Action taken
1=File existed and was opened
2=File did not exist and was created
If function unsuccessful
Carry flag=set
AX=Error code
----------------------------------------------------------------------
File, Get or set attributes of
Call with: AX=4300h if getting file attribute
AX=4301h if setting file attribute
CX=New file attribute if AL=01h
1 =Read-only
2 =Hidden
4 =System
20h=Archive
DS:DX=segment:offset of ASCIIZ path name
Returns : If file attribute set
Carry flag=clear
CX=File attribute
If file attribute not set
Carry flag=set
AX=01h, 02h, 03h, or 05h Error code
----------------------------------------------------------------------
File, Get or set date and time of
Call with: If getting date and time
AX=5700h
BX=Handle
If setting date and time
AX=5701h
BX=Handle
CX=Time
Bits 0Bh-0Fh=hours (0-23)
Bits 05h-0AH=minutes (0-59)
Bits 00h-04h=2-second increments (0-29)
DX=Date
Bits 09h-0Fh=year (relative to 1980)
Bits 05h-08h=month (1-12)
Bits 00h-04h=day (1-31)
Returns : If date and time set or got
Carry flag=clear
CX=Time
DX=Date
If not
Carry flag=set
AX=01h or 06h Error codes
----------------------------------------------------------------------
File, Lock or unlock region of
Call with: AX=5C00h if locking region
AX=5C01h if unlocking region
BX=Handle
CX=High part of region offset
DX=Low part of region offset
SI=High part of region length
DI=Low part of region length
Returns : If file created
Carry flag=clear
If not
Carry flag=set
AX=01h, 06h, 21h, or 24h Error codes
----------------------------------------------------------------------
File, Open
Call with: AH=3Dh
AL=Access mode...
0=read access
1=write access
2=read/write access
Sharing mode...
0 =compatibility mode
10h=deny all
20h=deny write
30h=deny read
40h=deny none
Inheritance flag...
0 =Child process inherits handle
80h=Child does not inherit handle
DS:DX=segment:offset of ASCIIZ path name
Returns : If file opened
Carry flag=clear
AX=Handle
If file unopened
Carry flag=set
AX=2, 3, 4, 5, or 0Ch Error code
----------------------------------------------------------------------
File, Rename
Call with: AX=5600h
DS:DX=segment:offset of current ASCIIZ path name
ES:DI=segment:offset of new ASCIIZ path name
Returns : If file renamed Carry flag=clear
If not
Carry flag=set
AX=02h, 03h, 05h, or 11h Error codes
----------------------------------------------------------------------
File, Set handle count (sets maximum number of files)
Call with: AX=6700h
BX=Number of desired handles
Returns : If handle count set Carry flag=clear
If not
Carry flag=set
AX=Error code
----------------------------------------------------------------------
File, Set location of pointer in
Call with: AX=4200h Absolute offset from start of file
AX=4201h Signed offset from current file pointer
AX=4202h Signed offset from end of file
BX=Handle
CX=Most significant half of offset to move
DX=Least significant half of offset to move
Returns : If file pointer set
Carry flag=clear
AX=Least significant half of resulting file pointer
DX=Most significant half of resulting file pointer
If file pointer not set
Carry flag=set
AX=01h or 06h Error code
----------------------------------------------------------------------
File or device, Read from
Call with: AX=3F00h
BX=Handle
CX=Number of bytes to read
DS:DX=segment:offset of buffer
Returns : If read
Carry flag=clear
AX=Number of bytes read
If not read
Carry flag=set
AX=05h or 06h Error code
----------------------------------------------------------------------
File or device, Write to
Call with: AX=4000h
BX=Handle
CX=Number of bytes to write
DS:DX=segment:offset of buffer
Returns : If written
Carry flag=clear
AX=Number of bytes written
If not written
Carry flag=set
AX=05h or 06h Error code
----------------------------------------------------------------------
Get Data Transfer Area (DTA) address
Call with: AX=2F00h
Returns : ES:BX=segment:offset of DTA
----------------------------------------------------------------------
Get Date
Call with: AX=2A00h
Returns : CX=Year (1980 through 2099)
DH=Month (1 through 12)
DL=Day (1 through 31)
AL=Day of the week (0=Sunday, 1=Monday,...)
----------------------------------------------------------------------
Get Extended Country Information
Call with: AX=6502h to get pointer to Uppercase Table
AX=6504h to get pointer to Filename Uppercase Table
AX=6506h to get pointer to Collating Table
AX=6507h to get pointer to DBCS Vector [Version 4.0+]
BX=Code page of interest (-1=active CON device)
CX=Length of buffer to receive information
DX=Country ID (-1=default)
ES:DI=Address of buffer to receive information
Returns : If file created
Carry flag=clear
If not
Carry flag=set
AX=02h Error code
----------------------------------------------------------------------
Get Extended Error Information
Call with: AH=59h
BX=00h
Returns : AX=Extended error code
BH=Error class...
01h Out of storage or handles
02h Temporary error (such as locked region in
file) that can be expected to end)
03h Authorization problem
04h Internal error in system software
05h Hardware failure
06h System software failure (such as missing
configuration files)
07h Application program error
08h File or item not found
09h File or item of invalid type or format
0Ah File or item locked
0Bh Wrong disk in drive, bad spot on disk, or
storage medium problem
0Ch Unknown error
BL=Recommended action...
01h Retry reasonable number of times, then prompt
user to select abort or ignore
02h Retry reasonable number of times with delay
between retries, then prompt user to select
abort or ignore
03h Get corrected information from user caused by
incorrect filename or drive specification
04h Abort application and by terminating the
program, releasing locks, closing files,...
05h Abort application.
06h Ignore error
07h Retry after user intervention to remove cause
of error
CH=Error locus...
01h Unknown
02h Block device
03h Network
04h Serial device
05h Memory
ES:DI=ASCIIZ volume label of disk to insert, if
AX=0022h (invalid disk change)
----------------------------------------------------------------------
Get Interrupt Vector
Call with: AX=3500h
AL=Interrupt number
Returns : ES:BX=segment:offset of interrupt handler
----------------------------------------------------------------------
Get DOS Version Number
Call with: AX=3000h
Returns : AL=Major version number
AH=Minor version number
----------------------------------------------------------------------
Get Program Segment Prefix (PSP) Address
Call with: AX=6200h
Returns : BX=Segment address of PSP
----------------------------------------------------------------------
Get Return Code
Call with: AX=4D00h
Returns : AH=00h if normal termination by Int 20h, Int 21h
Function 0, or Int 21h Function 4Ch
AH=02h if termination by critical-error handler
AH=03h if termination by Int 21h Function 31h or
Int 27h
AL=Return code passed by child process...0 if child
terminated by Int 20h, Int 21h Function 00h, or
Int 27h
----------------------------------------------------------------------
Get Time
Call with: AX=2C00h
Returns : CH=Hour (0 through 23)
CL=Minute (0 through 59)
DH=Second (0 through 59)
DL=Hundredths of a second (0 through 99)
----------------------------------------------------------------------
Get Verify Flag
Call with: AX=5400h
Returns : AL=00h if verify OFF
AL=01h if verify ON
----------------------------------------------------------------------
Get address of InDOS Flag
Call with: AX=3400h
Returns : ES:BX=Address of InDos flag
----------------------------------------------------------------------
Get or Set Allocation Strategy
Call with: If getting strategy code
AX=5800h
If setting strategy code
AX=5801h
BX=00h for First fit
BX=01h for Best fit
BX=02h for Last fit
Returns : If allocation strategy set or got
Carry flag=clear
AX=00h for First fit
AX=01h for Best fit
AX=02h for Last fit
If not
Carry flag=set
AX=01h Error code
----------------------------------------------------------------------
Get or Set Break Flag
Call with: AX=3300h if getting Break flag status
AX=3301h if setting Break flag status
Returns : If the Break flag is off DL=00h
If the Break flag is on DL=01h
If setting Break flag returns nothing
----------------------------------------------------------------------
Get or Set Code Page
Call with: AX=6601h to get code page
AX=6602h to select code page
If AX=6602h
BX=Code page to select
Returns : If code page set or got
Carry flag=clear
If also called with AL=01h
BX=Active code page
DX=Default code page
If not
Carry flag=set
AX=02h or 65h Error codes
----------------------------------------------------------------------
Get or Set Country Information
Call with: If getting internationalization information...
To get current country information
AX=3800h
To get information if country code < 255
AX=3801-38FEh
To get information if country code >= 255
AX=38FFh
BX=Country code if AL=FFh
DS:DX=segment:offset of buffer for returned info
If setting current country code...
AX=3801-38FEh if country code < 255
AX=38FFh if country code >= 255
BX=Country code if AX=38FFh
DX=FFFFh
Returns : If getting internationalization information...
If call successful
Carry flag=clear
BX=Country code
The buffer is filled in as follows:
Byte# 00h-01h=Date format...
Bit 0=USA month/day/year
Bit 1=Europe day/month/year
Bit 2=Japan year/month/day
Byte# 02h-06h=ASCIIZ currency symbol
Byte# 07h-08h=ASCIIZ thousands separator
Byte# 09h-0Ah=ASCIIZ decimal separator
Byte# 0Bh-0Ch=ASCIIZ date separator
Byte# 0Dh-0Eh=ASCIIZ time separator
Byte# 0Fh Currency format...
Bit 0=0 if currency value follows symbol
Bit 0=1 if currency symbol follows value
Bit 1=0 if no space between value and
currency symbol
Bit 1=1 if one space between value and
currency symbol
Bit 2=0 if currency symbol and decimal
are seperate
Bit 2=1 if currency symbol replaces
decimal seperator
Byte# 10h=Number of digits after decimal in
currency
Byte# 11h=Time format...
Bit 0=0 if 12-hour time
Bit 0=1 if 24-hour time
Byte# 12h-15h=Case-map call address
Byte# 16h-17h=ASCIIZ data-list separator
Byte# 18h-21h=Reserved
If call unsuccessful
Carry flag is set
AX=0002h Error code
----------------------------------------------------------------------
IOCTL (I/O control):
*Get Device Information
AX=4400h
BX=Handle
If function successful Carry flag: clear
DX=Device information word for a file...
Bits 0-5 =drive number (0=A, 1=B,...)
Bit 6 =0 (file has been written)
=1 (file has not been written)
Bit 7 =0 (indicating a file)
Bits 8-15=0 (reserved)
Device information for a device...
Bit 0 =1 (if console input)
Bit 1 =1 (if console output)
Bit 2 =1 (if NUL device)
Bit 3 =1 (if clock device)
Bit 4 =reserved
Bit 5 =0 (if handle in ASCII mode)
=1 (if handle in binary mode)
Bit 6 =0 (if end of file on input)
Bit 7 =1 (indicating a device)
Bits 8-13=reserved
Bit 14 =1 (if device supports IOCTL Read
and Write Control Data subfunctions)
=0 (if Control Data subfunctions not
supported)
Bit 15 =reserved
If function unsuccessful
Carry flag: set
AX=Error code (01h, 05h, or 06h)
*Change Sharing Retry Count
Call with: AX=440Bh
CX=Delays per retry (default=1)
DX=Number of retries (default=3)
Returns : If function successful
Carry flag: clear
If function unsuccessful
Carry flag: set
AX=Error code (01h)
*Check Input Status
Call with: AX=4406h
BX=Handle
Returns : If function successful
Carry flag: clear
And for a device
AL=00h (if device not ready)
=FFh (if device ready)
Or for a file
AL=00h (if file pointer at EOF)
=FFh (if file pointer not at EOF)
If function unsuccessful
Carry flag: set
AX=Error code (01h, 05h, 06h,or 0Dh)
*Check Output Status
Call with: AX=4407h
BX=Handle
Returns : If function successful
Carry flag: clear
And for a device
AL=00h (if device not ready)
=FFh (if device ready)
Or for a file
AL=FFh
If function unsuccessful
Carry flag: set
AX=Error code (01h, 05h, 06h,or 0Dh)
*Check if Block Device is Remote
Call with: AX=4409h
BX=Drive number (0=default, 1=A, 2=B,...)
Returns : If function successful
Carry flag: clear
DX=Device attribute word
Bit 12=0 (if drive is local)
=1 (if drive is remote)
If function unsuccessful
Carry flag: set
AX=Error code (01h or 0Fh)
*Check if Block Device is Removable
Call with: AX=4408h
BX=Drive number (0=default, 1=A, 2=B,...)
Returns : If function successful
Carry flag: clear
AL=00h (if medium is removable)
=01h (if medium is not removable)
If function unsuccessful
Carry flag: set
AX=Error code (01h or 0Fh)
*Check if Handle is Remote
Call with: AX=440Ah
BX=Handle
Returns : If function successful
Carry flag: clear
DX=Attribute word for file or device
Bit 15=0 (if local)
=1 (if remote)
If function unsuccessful
Carry flag: set
AX=Error code (01h or 06h)
*Generic I/O Control for Block Devices
Call with: AX=440Dh
BX=Drive code (0=default, 1=A, 2=B,...)
CX=Minor function code...
0840h=Set Device Parameters
0841h=Write Track
0842h=Format and Verify Track
0846h=Set Media ID (4.0+)
0847h=Set Access Flag
0860h=Get Device Parameters
0861h=Read Track
0862h=Verify Track
0866h=Get Media ID (4.0+)
0867h=Get Access Flag
DS:DX=segment:offset of parameter block
Returns : If function successful...
Carry flag: clear
...and if called with CL=60h or 61h
DS:DX=segment:offset of parameter block
If function unsuccessful
Carry flag: set
AX=Error code (01h or 02h)
*Generic I/O Control for Character Devices
Call with: AX=440Ch
BX=Handle
CH=Category (major) code:
00=Unknown
01=COM1, COM2, COM3, or COM4
03=CON (keyboard and display)
05=LPT1, LPT2, or LPT3
CL=Function (minor) code:
45h=Set Iteration Count
4AH=Select Code Page
4CH=Start Code Page Preparation
4DH=End Code Page Preparation
5Fh=Set Display Information [Version 4.0]
65h=Get Iteration Count
6AH=Query Selected Code Page
6BH=Query Prepare List
7Fh=Get Display Information [Version 4.0]
DS:DX=segment:offset of parameter block
Returns : If function successful
Carry flag: clear
And if called with CL=65h, 6Ah, or 6Bh
DS:DX=segment:offset of parameter block
If function unsuccessful
Carry flag: set
AX=Error code (01h)
*Get Logical Drive Map
Call with: AX=440Eh
BX=Drive code (0=default, 1=A, 2=B,...)
Returns : If function successful
Carry flag: clear
AL=Mapping code
=00h (if only one logical drive code assigned to
the block device) ...)
=01h-1Ah (logical drive code (1=A, 2=B,...)
mapped to the block device)
If function unsuccessful
Carry flag: set
AX=Error code (01h or 05h)
*Read Control Data from Block Device Driver
Call with: AX=4404h
BX=Drive code (0=default, 1=A, 2=B,...)
CX=Number of bytes to read
DS:DX=segment:offset of buffer
Returns : If function successful
Carry flag: clear
AX=Bytes transferred
If function unsuccessful
Carry flag: set
AX=Error code (01h, 05h, 06h,or 0Dh)
*Read Control Data from Character Device Driver
Call with: AX=4402h
BX=Handle
CX=Number of bytes to read
DS:DX=segment:offset of buffer
Returns : If function successful
Carry flag: clear
AX=Bytes read and
If function unsuccessful
Carry flag: set
AX=Error code (01h, 05h, 06h, or 0Dh)
*Set Device Information
AX=4401h
BX=Handle
DX=Device information word
Bit 0 =1 (if console input)
Bit 1 =1 (if console output)
Bit 2 =1 (if NUL device)
Bit 3 =1 (if clock device)
Bit 4 =0 (reserved)
Bit 5 =0 (to select ASCII mode)
=1 (to select binary mode)
Bit 6 =0 (reserved)
Bit 7 =1 (indicating a device)
Bits 8-15=0 (reserved)
Returns: If function successful Carry flag: clear
If function unsuccessful
Carry flag: set
AX=Error code (01h, 05h, or 06h)
*Set Logical Drive Map
Call with: AX=440Fh
BX=Drive code (0=default, 1=A, 2=B,...)
Returns : If function successful
Carry flag: clear
AL=Mapping code
=00h (if only one logical drive code assigned
to the block device)
=01h-1Ah (logical drive code (1=A, 2=B,...)
mapped to the block device)
If function unsuccessful
Carry flag: set
AX=Error code (01h or 05h)
*Write Control Data to Block Device Driver
Call with: AX=4405h
BX=Drive code (0=default, 1=A, 2=B,...)
CX=Number of bytes to write
DS:DX=segment:offset of data
Returns : If function successful
Carry flag: clear
AX=Bytes transferred
If function unsuccessful
Carry flag: set
AX=Error code (01h, 05h, 06h,or 0Dh)
*Write Control Data to Character Device Driver
Call with: AX=4403h
BX=Handle
CX=Number of bytes to write
DS:DX=segment:offset of data
Returns : If function successful
Carry flag: clear
AX=Bytes transferred
If function unsuccessful
Carry flag: set
AX=Error code (01h, 05h, 06h, or 0Dh)
----------------------------------------------------------------------
Memory, Allocate block
Call with: AX=4800h
BX=Number of paragraphs of memory needed
Returns : If memory allocated
Carry flag=clear
AX=Initial segment of allocated block
If not
Carry flag=set
AX=07h or 08h Error code
BX=Size of largest available block (paragraphs)
----------------------------------------------------------------------
Memory, Release block
Call with: AX=4900h
ES=Segment of block to be released
Returns : If memory released Carry flag=clear
If not
Carry flag=set
AX=07h or 09h Error code
----------------------------------------------------------------------
Memory, Resize block
Call with: AX=4A00h
BX=Desired new block size in paragraphs
ES=Segment of block to be modified
Returns : If memory resized Carry flag=clear
If not
AX =07, 08h, or 09h Error code
BX=Maximum block size available (paragraphs)
----------------------------------------------------------------------
Multiplex (Interrupt 2Fh)
Call with: AH=01h Print Spooler
AH=06h Resident ASSIGN command
AH=10h Resident SHARE command
AH=B7h Resident APPEND command
AL=Function number
Returns : If on input AL was equal to 0, AL will equal 0FFh upon
return. Otherwise it will depend on the handler
----------------------------------------------------------------------
Printer Output
Call with: AX=0500h
DL=ASCII code for character
----------------------------------------------------------------------
Redirect Handle
Call with: AX=4600h
BX=Handle for file or device
CX=Handle to be redirected
Returns : If handle redirected Carry flag=clear
If not AX=04h or 06h Error code
----------------------------------------------------------------------
Set Data Transfer Area (DTA) Address
Call with: AX=1A00h
DS:DX=segment:offset of disk transfer area
----------------------------------------------------------------------
Set Date
Call with: AX=2B00h
CX=Year (1980 through 2099)
DH=Month (1 through 12)
DL=Day (1 through 31)
Returns : If the date was set AL=00h
If the date was not set AL=FFh
----------------------------------------------------------------------
Set Extended Error Information
Call with: Assumes previous call to function 5900h
AX=5D0Ah
DS:DX=segment:offset of structure
----------------------------------------------------------------------
Set Interrupt Vector
Call with: AH=25h
AL=Interrupt number
DS:DX=segment:offset of interrupt handling routine
----------------------------------------------------------------------
Set Program Segment Prefix (PSP) Address
Call with: AX=5000h
BX=New PSP segment address
----------------------------------------------------------------------
Set Time
Call with: AX=2D00h
CH=Hour (0 through 23)
CL=Minute (0 through 59)
DH=Second (0 through 59)
DL=Hundredths of a second (0 through 99)
Returns : If the time was set AL=00h
If the time was not set AL=FFh
----------------------------------------------------------------------
Set Verify Flag
Call with: AH=2E00h
----------------------------------------------------------------------
Terminate Program:
Call with: AX=0000h
CS=Segment address of program segment prefix
----------------------------------------------------------------------
Terminate Program with Return Code
Call with: AH=4Ch
AL=Return code
----------------------------------------------------------------------
Terminate and Stay Resident
Call with: AH=31h
AL=Return code (0 through 255)
DX=Number of paragraphs to reserve in memory
╔═════════════════════════════════════════════════════════════════════╗
║ List of DOS Extended Error Codes ║
╚═════════════════════════════════════════════════════════════════════╝
Value... Meaning...
01h Function number invalid
02h File not found
03h Path not found
04h Too many open files
05h Access denied
06h Handle invalid
07h Memory control blocks destroyed
08h Insufficient memory
09h Memory block address invalid
0Ah Environment invalid
0Bh Format invalid
0Ch Access code invalid
0Dh Data invalid
0Eh Unknown unit
0Fh Disk drive invalid
10h Attempted to remove current directory
11h Not same device
12h No more files
13h Disk write-protected
14h Unknown unit
15h Drive not ready
16h Unknown command
17h Data error (CRC)
18h Bad request structure length
19h Seek error
1Ah Unknown media type
1Bh Sector not found
1Ch Printer out of paper
1Dh Write fault
1Eh Read fault
1Fh General failure
20h Sharing violation
21h Lock violation
22h Disk change invalid
23h FCB unavailable
24h Sharing buffer exceeded
25h Code page mismatched
26h end of file operation not completed
27h Disk full
28h-31h Reserved
32h Unsupported network request
33h Remote machine not listening
34h Duplicate name on network
35h Network name not found
36h Network busy
37h Device no longer exists on network
38h Network command limit exceeded
39h Error in network adapter hardware
3Ah Incorrect response from network
3Bh Unexpected network error
3Ch Remote adapter incompatible
3Dh Print queue full
3Eh Not enough room for print file
3Fh Print file was deleted
40h Network name deleted
41h Network access denied
42h Incorrect network device type
43h Network name not found
44h Network name limit exceeded
45h Network session limit exceeded
46h Temporary pause
47h Network requested not accepted
48h Print or disk redirection paused
49h-4Fh Reserved
50h File already exists
51h Duplicate FCB
52h Cannot make directory
53h Fail on Int 24H (critical error)
54h Too many redirections
55h Duplicate redirection
56h Invalid password
57h Invalid parameter
58h Network write error
59h Function not supported by network
5Ah Required system component not installed
65h Device not selected
╔═════════════════════════════════════════════════════════════════════╗
║ Using the XYZ Critical Error Handler ║
╚═════════════════════════════════════════════════════════════════════╝
If you were to try and copy a file from your hard disk to a floppy,
and there was no floppy disk in the drive bay, the copy program could
not continue because it cannot copy a file to an empty drive. This
would be an example of a critical error. Other examples would be:
Attempting to write a file to a write-protected disk,
A disk sector is unreadable,
Attempting to read or write to an unformatted disk,
The printer is out of paper, and so on.
Anything listed in the section titled "List of DOS extended error
codes" would also be a good example. Anyways, the program would
have to stop the current task until something is done to enable the
task to be continued. Usually, DOS will print out the infamous
"Abort, Retry, or Fail?" to the current cursor location on the
screen. If you have already gone to great lengths to draw pretty
screen graphics, then DOS will write "Abort, Retry, or Fail?" right
in the middle of all of it! Wouldn't it be better if you could
intercept DOS's improper attempt at correcting a critical error and
replace it with one of your own? You can, with the XYZ critical
error handler! But how does it work?
To enable the XYZ Critical Error Handler, all you need to do is
include one label in your coding. That label should be called
"CriticalError". Somewhere underneath that label, you must include a
"ret" command, since DOS is in an unstable state after responding to
a critical error and is waiting for a response from you as to what to
do, so you must return to the DOS handler.
When a critical error occurs, the reserved argument "error" will
contain one of the error codes listed in the section titled "List of
DOS extended error codes". This code will give you an idea of what
happened and how you might possibly respond to it. There are two
things to remember when responding to a critical error. One is to
inform the user of the error and how to possibly correct the
situation, i.e. -- "There is no disk in drive A:, please insert the
disk now. Press 'Enter' when you are ready." Two, you must use the
command "set error=" to inform the system of your decision of how to
handle the critical error. If error is set to...
0...then the system will act like no error occurred and return
control to the program
1...then the system will keep retrying
2...then the system will terminate the program
3...then the system will act like error occurred but return
control to program anyways.
If you respond with an incorrect decision (i.e. -- the program
cannot continue if the error is not corrected or if the error cannot
be corrected as in a divide by zero or dos internal error), then the
critical error will keep returning to your critical error handler
until the situation is resolved or you terminate the program by
setting error=2.
For example:
000 Example of Critical Error Handling
dat txt 15 filename=a:\xyz.zip
dat txt ErrorMessage=I can't read from drive a...
set color=0A 00 00
set start=1
set size=28
set mode=0
file open filename
jer Quit
tty filename
--- Quit
file close handle
end with 1
--- CriticalError
set color=0C 00 00
set error=3 Informs system to act like an error occured
tty ErrorMessage
ret
eof
Now if the disk is not present when this program tries to open the
file on drive a, then the program will automatically jump to the
"CriticalError" section and display the message "I can't read from
drive a..." before quitting. Otherwise this program will display
"a:\xyz.zip" and quit.